一、希尔排序原理
1. 插入排序的问题
逆序有序的数组排序时,时间复杂度为O ( n 2 ) O(n^2)O(n
2
),此时效率最低 顺序有序的数组排序时,时间复杂度为O ( n ) O(n)O(n),此时效率最高
我们发现,当被排序的对象越接近有序时,插入排序的效率越高,那我们是否有办法将数组变成接近有序后再用插入排序,此时希尔大佬就发现了这个排序算法,并命名为希尔排序
2. 希尔排序的思路
希尔排序是对插入排序的优化,基本思路是先选定一个整数作为增量,把待排序文件中的所有数据分组,以每个距离的等差数列为一组,对每一组进行排序,然后将增量缩小,继续分组排序,重复上述动作,直到增量缩小为1时,排序完正好有序。 希尔排序原理是每一对分组进行排序后,整个数据就会更接近有序,当增量缩小为1时,就是插入排序,但是现在的数组非常接近有序,移动的数据很少,所以效率非常高,所以希尔排序又叫缩小增量排序。
每次排序让数组接近有序的过程叫做预排序,最后一次插入是直接插入排序
二.代码
Void ShellSort(int A[],int n){
int i,j,steplen;
//1.步长外循环,增量变化
for(steplen=n/2;steplen>0;steplen=steplen/2){
for(i=steplen+1;i<=n;i++){//2.子表内循环,采用插入排序
if(A[i-steplen]>A[i]){
A[0]=A[i];
for(j=i-steplen;j>0&&A[j]>A[0];j-=steplen){//实现前面比当前元素大的跳步后移
A[j+steplen]=A[j];
}
A[j+steplen]=A[0];
}
}
}
}