希尔排序

来源:互联网 发布:工程问题c语言求解 pdf 编辑:程序博客网 时间:2024/04/29 01:08
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.其实这一层里面是插入排序的步骤,不同之处是直接的插入排序数字是连续的,而这种插入排序的各个元素是不连续的,但是他们也是有规律的,因为每个元素的位置之差就是一个增量的值,我们可以抽象的认为这个子数组也是一个连续的数组。



0 0