参考链接
排序分类(9)
1. 插入排序
直接插入排序
-
难度:简单 必须掌握
-
思路:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表
-
图示:
-
算法复杂度:O(n^2) ;稳定算法
-
代码:
void InsertSort(int a[],int n) { for(int i=1;i<n;i++)//若第i个元素大于i-1元素,直接插入;小于的话,移动有序表后插入 { if(a[i]<a[i-1]) { int j=i-1;//记录哨兵前角标 int x=a[i];//复制为哨兵,即存储待排序元素 a[i] = a[i-1];//先后移一个元素 while(x<a[j] && j>=0)//查找在有序表的插入位置 { a[j+1]=a[j];//元素后移 j--; } a[j+1]=x;//插入到正确位置 } } }
-
记忆要点:
- for if while结构
- 记录哨兵前项角标-复制哨兵-先移动一个-查找插入位置-元素后移-插入正确位置
希尔排序(缩小增量排序)
-
难度:较易 操作方法必须掌握
-
思路:直接插入排序的变种;先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序
-
操作方法:
- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;简单增量序列:d = {n/2 ,n/4, n/8 …1} n为要排序数的个数
- 按增量序列个数k,对序列进行k趟排序
- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序;仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度
-
算法复杂度:O(n^(1.3—2)) ;非稳定算法
-
代码:
void ShellInsertSort(int a[],int n,int dk) { for(int i=dk;i<n;i++) { if(a[i]<a[i-dk]) { int j=i-dk; int x=a[i]; a[i] = a[i-dk]; while(x<a[j]) { a[j+dk]