标签:
希尔(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,此时就是最后一次排序,对整个数组进行简单的插入排序。
下面是实现代码示例:
标签:
原文地址:http://www.cnblogs.com/pokid/p/4924149.html