希尔排序有时也被称为缩小增量排序.它的做法不是每次一个元素和下一个元素进行比较.而是一开始时使用较大的增量为间隔进行比较,然后增量缩小,直至增量缩小为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;
}
网友评论