排序问题-希尔排序

来源:互联网 发布:minecraft 源码 unity 编辑:程序博客网 时间:2024/06/06 08:55

希尔排序通过比较一定间隔的元素来工作,各趟比较所用的距离随着排序算法的进行而减小,直到间隔为1-也就是直到比较完相邻的两个元素时算法结束。

希尔排序使用的序列叫做增量序列,希尔排序的性能主要取决于增量序列的选取。一般避免选取各增量有公因子的增量序列,这样会有子序列重复排序。shell本人建议选取An=N/2的增量序列,此时最坏情况下运行时间为O(N2);Hibbard提出了一个An=2的k次幂-1的增量序列,其最坏的运行时间为O(N3/2)。

排序过程如下序列所示:

初始序列:9 4 7 8 10 3 1 12 2

增量为4: 2 3 1 8 9 4 7 12 10

增量为2:1 3 2 4 7 8 9 12 10

增量为1:1 2 3 4 7 8 9 10 12

源码如下:

void shell_sort(int arr[], int count){int i, j, increment;int tmp;for(increment = count / 2; increment > 0; increment /= 2 ){/*使用插入排序的方式实现希尔排序*/for(i = increment; i < count; i++){tmp = arr[i];for(j = i; j >= increment; j -=increment){if(tmp < arr[j - increment]){arr[j] = arr[j - increment];}else{break;}}arr[j] = tmp;}}}
上边源码中子序列使用的是插入排序,相比于插入排序和冒泡排序,希尔排序运行的时间大大减少,使用十万的随机数字排序时间如下(微秒):

使用90w的随机数字排序时间如下:



0 0
原创粉丝点击