其他分享
首页 > 其他分享> > 初等排序1

初等排序1

作者:互联网

目录

 

初等排序1

一.三种初等排序算法

1.插入排序法

2.冒泡排序法

3.选择排序法

二.稳定排序

三.总结1


初等排序1

 

一.三种初等排序算法

 

1.插入排序法

 

插入排序法:从左到右对数据进行排序,将待排序的数据插入前面已经排序的数据的合适位置,直到插入最后一个数据。

插入排序法的算法如下:

	for(i=1;i<n;i++){
		x=a[i];
		j=i-1;
		while(j>=0&&a[j]>x){
			a[j+1]=a[j];
			j--;
		}
		a[j+1]=x;
	}

在最坏的情况下,第i次循环需要进行i次移动,插入排序法一共要要进行1+2+3+\cdots +n-1+n=(n^2-n)/2次移动,因为n相对于n^{2}来说很小,再省略常熟,所以该算法的复杂度为O(n^{2})。

如果输入的数据本身就是按照升序或降序排列,该算法只需进行i次不需要移动的循环。

综上,插入排序法适用于相对有序的数据。

 

2.冒泡排序法

 

冒泡排序法:顾名思义,冒泡排序法就是让数组元素像水中的气泡一样逐渐上浮,进而达到排序的目的。

冒泡排序法的算法如下:

while(flag){
		flag=0;
		for(j=n-1;j>i;j--){
			if(a[j]<a[j-1]){
				t=a[j];
				a[j]=a[j-1];
				a[j-1]=t;
				flag=1;
			}
		}
		i++;
}

冒泡排序法再最坏的情况下,也要进行1+2+3+\cdots +n-1+n=(n^2-n)/2次移动,所以算法的复杂度也为O(n^{2})。

同时,算法移动的次数也为这组数据的反序数或逆序数,可以体现数组的错乱程度。

 

3.选择排序法

 

选择排序法:在每一次循环中找到最小值,放到已经排好序的数据之后。

选择排序法的算法如下:

	for(i=0;i<n;i++){
		min=i;
		for(j=i;j<n;j++){
			if(a[min]>a[j]){
				min=j;
			}
		}
		t=a[i];
		a[i]=a[min];
		a[min]=t;
	}

无论什么情况,选择排序法都要进行1+2+3+\cdots +n-1+n=(n^2-n)/2次比较运算,因此算法复杂度同样为O(n^{2})。

但是选择排序法是不稳定的排序算法。

 

二.稳定排序

 

稳定排序:当数据中存在2个或2个以上键值相等的元素时,这些元素在排序前后顺序不变。

上面的插入排序法和冒泡排序法为稳定的排序算法,而选择排序法为不稳定的排序算法。

用如下的笨方法可以检查排序结果是否稳定:


	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			for(a=0;a<n;a++){
				for(b=a+1;b<n;b++){
					if(in[i]的数字==in[j]的数字&&in[i]==out[b]&&in[j]==out[a]){
						return false;
					}
				}
			}
		}
	}
	return true;

此方法的复杂度为O(n^{4}),在n比较大时效率比较低,不方便。

因为冒泡排序法和插入排序法属于稳定的排序算法,所以将选择排序法的结果和二者进行比较,就能知道结果是否稳定,此复杂度为O(n)。

 

三.总结1

 

虽然三种初等排序方法的最坏复杂度均为O(n^2),但适用于不同的数据下。

冒泡排序法与选择排序法相比,一个是从局部入手减少逆序元素,一个是从大局逐个选择最小元素。

另外,冒泡排序法和选择排序法比较运算的次数不受输入的数据的影响,而插入排序法受数据影响,处理一些特殊的数据时效率更高。

 


读《挑战程序设计竞赛》第二天 (侵删) 2021.2.20

 

标签:数据,复杂度,冒泡排序,算法,排序,初等,插入排序
来源: https://blog.csdn.net/weixin_51302676/article/details/113891635