主要参考算法导论,以及网上相关资料,相关参考会贴链接。
|
稳定性 |
时间分析 |
空间分析 |
||
最好 |
最差 |
平均 |
|||
气泡排序 |
稳定排序 |
O(n) |
O(n2) |
O(n2) |
O(1) |
插入排序 |
稳定排序 |
O(n) |
O(n2) |
O(n2) |
O(1) |
选择排序 |
不稳定 |
O(n2) |
O(n2) |
O(n2) |
O(1) |
归并排序 |
稳定排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(n) |
桶排序 |
稳定排序 |
O(n) |
|
|
O(k) |
基数排序 |
稳定排序 |
O(d(n+r)) |
O(d(n+r)) |
O(d(n+r)) |
O(n+r) |
希尔排序 |
不稳定 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(1) |
堆排序 |
不稳定 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(1) |
快速排序 |
不稳地 |
O(nlogn) |
O(n2) |
O(nlogn) |
O(logn) |
1.冒泡排序
主要思想:冒泡排序通过从前向后(或从后向前)相邻两个元素一次比较,然后根据大小交换位置,按照既定的降序或升序规则确定最后浮出的元素。
代码实现:
1 void BubbleSort(int A[],int n){ 2 //用冒泡排序法将序列A中的元素从小到大排列 3 for(int i=0;i<n-1;i++){ 4 bool flag=false; //表示本趟是否发生交换的标志 5 for(int j=n-1;j>i;j--){ 6 if(A[j-1]>A[j]){ 7 int temp=A[j-1]; 8 A[j-1]=A[j]; 9 A[j]=temp; 10 flag=true; 11 } 12 } 13 if (flag==false) 14 return; 15 } 16 }
2.插入排序
主要思想:将数据分为两部分,一部分已经是有序,另一部分乱序,依次从乱序部分取出一个元素,与有序部分中的元素比较,最后放在合适位置。
代码实现:
1 void InsertSort(int A[],int n){ 2 int i,j; 3 for(i=2;i<n;i++){ //依次将A[2]~A[n]插入前面已经排好的序列 4 if(A[i]<A[i-1]){ 5 int temp=A[i]; 6 for(j=i-1;temp<A[j]&&j!=0;j--) 7 A[j+1]=A[j]; //向后挪位 8 A[j+1]=temp; //复制到插入位置 9 } 10 } 11 }
3.选择排序
主要思想:将乱序部分的元素比较,取出最小(最大)元素,重复该操作直至所有元素都有序排列
代码实现
1 void SelectSort(int A[],int n){ 2 //将数组A做简单选择排序,A[]从0开始存放元素 3 for(int i=0;i<n;i++){ 4 int index=i; 5 for(int j=i+1;j<n;j++){ 6 if(A[j]<A[index]) 7 index=j; 8 } 9 if(index!=i) swap(A[i],A[index]); 10 } 11 }
4.归并排序
主要思想:分而治之的思想,利用递归将待排元素划分为一个个的元素,然后两两归并,归并后的小数组继续两两归并知道大数组完全有序。大概过程如下如所示
代码实现:
1 //Merge()的功能是将前后相邻的两个有序表归并为一个有序表 2 void Merge(int A[],int low,int mid,int high,int temp[]){ 3 int k,i,j; 4 for( k=low;k<=high;k++) 5 temp[k]=A[k]; 6 for( i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){ 7 if(temp[i]<temp[j]) 8 A[k]=temp[i++]; 9 else 10 A[k]=temp[j++]; 11 } 12 while(i<=mid) A[k++]=temp[i++]; 13 while(j<=high) A[k++]=temp[j++]; 14 } 15 16 void MergeSort(int A[],int low,int high,int temp[]){ 17 18 if(low<high){ 19 int mid=(low+high)/2;//从中间划分两个子序列 20 MergeSort(A,low,mid,temp); //对左侧子序列递归排序 21 MergeSort(A,mid+1,high,temp); //对右侧子序列递归排序 22 Merge(A,low,mid,high,temp); //归并 23 } 24 }
5.Shell排序
主要思想: