-
冒泡排序
时间复杂度
若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数
和记录移动次数
均达到最小值:
,
。
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D12/sign=5e6ca6622c738bd4c021b633a08bb91b/b3b7d0a20cf431ad4f379a864936acaf2fdd98ac.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D16/sign=c765e07cd5ca7bcb797bc329bf09e8ac/48540923dd54564e27333d86b1de9c82d1584f3f.jpg)
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D84/sign=c4f5a2db0b23dd542573aa6cd0090824/78310a55b319ebc4b8a3a8268026cffc1f1716b1.jpg)
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D66/sign=1745c99097cad1c8d4bbff217e3e11cd/b21c8701a18b87d6007472a0050828381f30fd5f.jpg)
所以,冒泡排序最好的
时间复杂度为
。
若初始文件是反序的,需要进行
趟排序。每趟排序要进行
次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D33/sign=feddd1e257fbb2fb302b5e114e4a94f7/b58f8c5494eef01f9d1ac17ae2fe9925bc317d07.jpg)
若初始文件是反序的,需要进行
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D32/sign=411c7ed7d309b3deefbfe26acdbf0492/8b82b9014a90f60364df45f83b12b31bb051ed26.jpg)
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D30/sign=3af139940cf41bd5de53eef450da752f/503d269759ee3d6d1214597441166d224e4adebb.jpg)
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D171/sign=f38fc3a1bb389b503cffe455b434e5f1/838ba61ea8d3fd1f846a7b85324e251f95ca5f2a.jpg)
![](https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D186/sign=41bfe6dab119ebc4c4787291b427cf79/7af40ad162d9f2d36fa2fd50abec8a136227ccda.jpg)
冒泡排序的最坏时间复杂度为
。
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D40/sign=17b28fa860d0f703e2b294dc09fa9d5c/e4dde71190ef76c63a4e22949f16fdfaae5167f5.jpg)
综上,因此冒泡排序总的平均时间复杂度为
。
![](https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D40/sign=17b28fa860d0f703e2b294dc09fa9d5c/e4dde71190ef76c63a4e22949f16fdfaae5167f5.jpg)
算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
C语言算法
void maopao(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]>a[j+1]) { t=a[j];a[j]=a[j+1];a[j+1]=t; } for(i=0;i<n;i++) printf(" %d ",a[i]); printf("\n"); }指针版
void maopao1(int *p,int n) { int i,j,k,*p1; p1=p; for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(*(p+j)>*(p+j+1)) { k=*(p+j);*(p+j)=*(p+j+1)=k; } for(i=0;i<n;i++) printf(" %d ",*(p1+i)); printf("\n"); }
选择排序
排序算法即解决以下问题的算法:
输入
n个数的序列<a1,a2,a3,...,an>。
输出
原序列的一个重排<a1*,a2*,a3*,...,an*>;,使得a1*<=a2*<=a3*<=...<=an*
排序算法有很多,包括
插入排序,
冒泡排序,
堆排序,
归并排序,选择排序,
计数排序,
基数排序,
桶排序,
快速排序等。插入排序,堆排序,选择排序,归并排序和快速排序,冒泡排序都是比较排序,它们通过对
数组中的元素进行比较来实现排序,其他排序算法则是利用非比较的其他方法来获得有关输入数组的排序信息。
思想
n个记录的文件的
直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出
关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
C语言实现
void xuanze(int a[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(a[j]<a[k]) { t=a[j];a[j]=a[k];a[k]=t; } } for(i=0;i<n;i++) printf(" %d ",a[i]); printf("\n"); }
指针版
void xuanze1(int *p,int n) { int i,j,k,t,*p1; p1=p; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(*(p+j)<*(p+k)) { t=*(p+j);*(p+j)=*(p+k);*(p+k)=t; } } for(i=0;i<n;i++) printf(" %d ",*(p1+i)); printf("\n"); }
完整
#include<stdio.h> void maopao(int a[],int n); void xuanze(int a[],int n); void maopao1(int *p,int n); void xuanze1(int *p,int n); void main() { int i; int a[10];; printf("输入每个数:"); for(i=0;i<10;i++) scanf("%d",&a[i]); printf("\n冒泡排序"); maopao(a,10); printf("\n选择排序"); xuanze(a,10); printf("\n选择排序"); maopao1(a,10); printf("\n选择排序"); xuanze1(a,10); } void maopao(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]>a[j+1]) { t=a[j];a[j]=a[j+1];a[j+1]=t; } for(i=0;i<n;i++) printf(" %d ",a[i]); printf("\n"); } void xuanze(int a[],int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(a[j]<a[k]) { t=a[j];a[j]=a[k];a[k]=t; } } for(i=0;i<n;i++) printf(" %d ",a[i]); printf("\n"); } void maopao1(int *p,int n) { int i,j,k,*p1; p1=p; for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(*(p+j)>*(p+j+1)) { k=*(p+j);*(p+j)=*(p+j+1)=k; } for(i=0;i<n;i++) printf(" %d ",*(p1+i)); printf("\n"); } void xuanze1(int *p,int n) { int i,j,k,t,*p1; p1=p; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(*(p+j)<*(p+k)) { t=*(p+j);*(p+j)=*(p+k);*(p+k)=t; } } for(i=0;i<n;i++) printf(" %d ",*(p1+i)); printf("\n"); }
结果