ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

初等排序1

2021-02-20 21:33:55  阅读:148  来源: 互联网

标签:数据 复杂度 冒泡排序 算法 排序 初等 插入排序


目录

 

初等排序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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有