排序算法之希尔排序

1)基本思想

希尔排序是基于插入排序的,它首先是对一定间隔的元素进行插入排序,然后缩小间隔,再次进行插入排序,直到间隔为1,此时数组已经基本排好序,那么最后一次的插入排序将非常快。这个间隔也叫增量(increment),因而也叫缩小增量排序。

如果增量序列为h1,h2,...ht, h1必须为1,最终的排序才算完成。对于增量hk(h1 < hk < ht),需要将排序结束后,A[i]<=A[i+hk],即相隔hk的元素是排好序的,也称数组是hk-排序的。示例如下:

初始数组 81 94 11 96 12 35 17 95 28 58 41 75 15
increment = 5排序之后 35 17 11 28 12 41 75 15 96 58 81 94 95
increment = 3排序之后 28 12 11 35 15 41 58 17 94 75 81 96 95
increment = 1排序之后 11 12 15 17 28 35 41 58 75 81 94 95 96

比如inc = 5时,先对(81 35 41)进行插入排序得到35 94 11 96 12 41 17 95 28 58 81 75 15,然后对(94 17 75)插入排序得到(35 17 11 96 12 41 75 95 28 58 81 94 15),接着对(11 95 15)排序得(35 17 11 96 12 41 75 15 28 58 81 94 95),然后对(96 28)排序得(35 17 11 28 12 41 75 15 96 58 81 94 95),然后对(12 58)排序得(35 17 11 28 12 41 75 15 96 58 81 94 95),共需要对Inc组的插入排序。

2)算法实现

如果令hk = h(k-1)/2,那么:

 1 void shellSort(int A[], int n)
 2 {
 3     for(int inc = n/2; inc > 0; inc/=2)
 4     {
 5         for(int i = inc; i < n; i++)
 6         {
 7             int temp = A[i];
 8             int j;
 9             for(j = i; j > 0; j -= inc)
10             {
11                 if(A[j-inc] > temp)
12                 {
13                     A[j] = A[j-inc];
14                 }
15                 else
16                     break;
17             }
18             A[j] = temp; 
19         }
20     }
21 }

3)复杂度分析

希尔排序中,增量的选取非常关键,但究竟如何选择,目前还是一个数学难题。但已有研究表明,选取合适的增量,可以使复杂度为O(n^(3/2))。

此外,需要注意,由于希尔排序是跳跃式的移动,所以是不稳定排序。

posted on 2013-05-17 10:14  Sophia-呵呵小猪  阅读(136)  评论(0编辑  收藏  举报