希爾排序有時也被稱為縮小增量排序.它的做法不是每次一個元素和下一個元素進行比較.而是一開始時使用較大的增量為間隔進行比較,然后增量縮小,直至增量縮小為1.
希爾排序是基于插入排序的以下兩點性質而改進的:
- 插入排序對順序雜亂度越低的數組操作時,效率越高.
- 插入排序一般而言都是低效的,因為每次只能將數據移動一位.
算法思路:
- 取一個不大于數組長度 n 的正整數a1(a1 < n), 把全部的數據分為 a1個組(即所以距離為 a1倍數的數據為1組),然后再各組內進行插入排序.
- 然后取 a2(a2 < a1)
- 重復上述的操作, 直至 ai = 1(即所有的數據為1組), 最后對這組進行插入排序.一般而言, a1 = n/2, a2 = a1/2,....,ai = 1.
double *ShellSort(double *a, int n){
int i, j, Increment;
double tmp;
for(Increment = n/2; Increment > 0; Increment /= 2){
for(i = Increment; i < n; i++){
tmp = a[i];
for (j = i; j >= Increment ; j -= Increment) {
if(tmp < a[j - Increment])
a[j] = a[j - Increment];
else
break;
}
a[j] = tmp;
}
}
return a;
}