排序-希尔排序

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

你可能感兴趣的:(排序-希尔排序)