希尔排序

希尔(Shell)排序算是插入排序的一种改进。

在插入排序的过程中,数组元素移动到相邻位置。当一个元素离他的正确位置很远时,就必须做很多次这样的移动。

如果一个数组是完全乱序的,插入排序就要花很长时间,但是如果一个数组接近有序,移动次数就很少,效率就比较高了。

希尔算法是唐纳德希尔(Donald Shell)根据这个观察发明的,希尔想让元素移动到比相邻位置更远的地方。为此,他使用等距离索引相间的元素构成的子数组进行排序,这样元素可以移动到更远的地方,其结果是得到一个更接近有序的数组,从而使数组使用插入排序更有效。

例如一组元素a[]={6, 3, 5, 8, 1, 10,7}

第一次选取间隔为arr.length/2=3(int型);如下逻辑,对6,8,7一组,3,1一组,5,10一组分别进行插入排序

注意,每个子元素组排序时在原有的位置基础上进行排序。比如说6,8,7一组位置分别为a[0],a[3],a[6]排玩须后位置分别为a[0],a[6],a[3];

6  3  5  8  1  10  7

6-------8--------7

   3-------1       

       5-------10

于是第一次排序结果为:6 1 5 7 3 10 8

之后每次的排序取前面的间隔/2,知道间隔取值为1时排序结束。

比如上面的例子第二次排序取间隔继续除以2,即a.length/4=1,此时就是最后一次排序,对整个数组进行简单的插入排序。

下面是实现代码示例:

 

posted on 2015-10-30 18:45  pokid  阅读(264)  评论(0编辑  收藏  举报

导航