初等排序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.冒泡排序法

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

冒泡排序法的算法如下:

bubbleSort() {
	flag = 1;
	i = 0;
	while (flag) {
		flag = 0;
		for (j = n - 1; j >= i + 1; j--) {
			if (a[i] < a[j - 1]) {
				a[j]与a[j - 1]交换
					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),但适用于不同的数据下。

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

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


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

( 2021.7.5 第一次修改)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值