您的位置:首页 > 其它

希尔排序

2016-06-02 16:31 197 查看
private static void shell_Sort(int[] unsorted,int n){//希尔排序
int i,j,gap;
for(gap=n/2;gap>0;gap/=2){
for(i=0;i<gap;i++){
for(j=i+gap;j<n;j+=gap){
if(unsorted[j]<unsorted[j-gap]){
int temp=unsorted[j];
int k=j-gap;
while(k>=0&&temp<unsorted[k]){
unsorted[k+gap]=unsorted[k];
k-=gap;
}
unsorted[k+gap]=temp;
}
}
}
}
}


       个人觉得希尔排序是插入排序的改进版,完成这种排序的关键是得找到增量,找到增量之后把数组分割成子数组,然后分别运用插入排序的方式完成排序,其中最后一次的增量必定是1,其实要想插入排序的效率最高,就是这组数据不会是很乱的,而希尔排序使序列变得不在那么凌乱,这也是希尔排序效率较高的直接原因。

如代码所示,首先是gap的求法,查阅了相关资料之后,gap有种固定的求法,第一次是用数组元素的个数对2取整,接着每次用这个整数再对2取整,这样知道gap等于0时就退出循环,其中gap必有一次是等于1的。

        代码分析:1.第一层的for循环是求增量,增量会越来越小,当增量为0时已经无需执行循环体了,所以就会退出循环

                            2.第二层循环是给出每次增量的个数,以让循环体内形成子数组。

    3.其实这一层里面是插入排序的步骤,不同之处是直接的插入排序数字是连续的,而这种插入排序的各个元素是不连续的,但是他们也是有规律的,因为每个元素的位置之差就是一个增量的值,我们可以抽象的认为这个子数组也是一个连续的数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: