您的位置:首页 > 其它

排序七部曲之(七)希尔排序

2016-05-18 17:44 253 查看
希尔排序的原理:本质上是插入排序。插入排序在某些情况下效率是很高的,比如需要排序的序列基本有序时,插入排序的效率可以接近O(N)。

那么问题在于,现实中的序列基本上都是不满足基本有序的,如何使一个序列在进行插入排序前是满足基本有序的呢?科学家希尔将插入排序进行了改进,提高了排序的效率。

希尔排序的实现:将待排序列分割成若干个子序列,但子序列的不是逐段分割的,每个子序列由相隔某个增量的元素组成,对各个子序列进行插入排序。然后将增量缩小,再次分割成一个个的子序列。。。,最后直到增量为1时,整个序列只有一个子序列,就是序列本身。

以序列12 17 30 50 20 60 65 4 19为例

第一次增量gap=N/2=4

序列分成4个子序列{12,20},{17,60},{30,65},{50,4},(分组没有改变元素原来的位置)分别进行插入排序后的序列为:

12 17 30 4 20 60 65 50 19

第二次增量为gap=gap/2=2

序列分成2个子序列{12,30,20,65},{17,4,60,50},排序后

12 4 20 17 30 50 65 60 19

第三次增量为gap=1

序列分成一个子序列{12,4 ,20 ,17 ,30, 50, 65 ,60, 19},排序后

4 12 17 19 20 30 50 60 65 

//希尔排序,对长度为n的数组a排序
static void shellSort()
{
for(int gap=n/2;gap>0;gap/=2)
{
for(int i=0;i<gap;i++)
{//将原序列分成了gap组每组为:(i,gap+i,2*gap+i,...)
for(int j=i+gap;j<n;j+=gap)
{
int k=j;
int target=a[j];
while(k>=gap && target<a[k-gap])
{
a[k]=a[k-gap];
k=k-gap;
}
a[k]=target;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: