排序算法之四 Shell排序

来源:互联网 发布:数控车床编程图文实例 编辑:程序博客网 时间:2024/05/16 16:09

Shell 排序是将待排序序列 d 进行分组排序,分组排好序之后,在增大组数(也就是减小分组间隔)来进行分组排序,一直到分组间隔足够小(为 1 时)就得到了排好序的结果数组。

Shell 排序过程示例如下:

待排序数组:10 6 3 7 2 8 9 2 4 1      n = 10

Step1:以 (10/2 = 5) 为分组间隔进行排序:i 与(i+5),i + 5 < n

结果:10 6 3 7 2  ---->   8 6 2 4 1 ---->  8 6 2 4 1 10 9 3 7 2

           8  9 2 4 1  ---->  10 9 3 7 2

Step2:以 (5/2 = 2)为分组间隔进行排序:i 与(i+2),i + 2 < n

结果:8  6            1  2

          2  4            2  3

          1  10   ---->7  4  ---->  1 2 2 3 7 4 8 6 9 10

          9  3            8  6

          7  2            9  10

Step3:以 (2/2 = 1)为分组间隔进行排序:i 与(i+1),i + 1 < n

结果:1 2 2 3 7 4 8 6 9 10  ---->  1  2  2  3  4  6  7  8  9  10

Step4:1 / 2 = 0,结束!

算法实现代码如下(每次的分组间隔建议选取上一次的1/2):

void shellSort(double *dataIn, int sizeIn){/* 2012/08/23, by wbprime@myopera.com */for (int g = sizeIn / 2; g > 0; g /= 2) {    for (int i = g; i < sizeIn; ++i)        for (int j = i - g; j >= 0 && dataIn[j] > dataIn[j+g]; j -= g)            swap(dataIn[j], dataIn[j+g]);}}