06_排序_希尔排序

【原理】

1.选择一个步长序列T1,T2,T3...,Tk,满足Ti>Tj(i<j),Tk=1。(步长:即每次插入排序的步长)

2.按步长序列的个数K,对待排序序列进行K趟排序。

3.每趟排序,根据对应的步长Ti,对待排序列分割成Ti个子序列,分别对子序列进行插入排序。

 

【用例】

待排列数组

[ 26 53 67 48 57 13 48 32 60 50 ]

初始化关键字:(此时步长为5)

 

 

 

第一趟结果

[ 13 48 32 48 50 26 53 67 60 57 ]

初始化(此时步长为3)

[ 13 48 32 48 50 26 53 67 60 57 ]

 

 

 

第二趟结果

[13 48 26 48 50 32 53 67 60 57]

初始化:此时步长为1

[13 48 26 48 50 32 53 67 60 57]

 

第三趟结果

[13  26 32 48 48 50 53 57 60 67]

 

 [代码实现]

package com.sort;

public class TestShellSort {
    public static void  shellSort(int[] array){
        int length=array.length;
        int i,j;
        int h;    //h为每次的步长
        int temp;
        for(h=length/2;h>0;h=h/2){  //步长每次减小为原来的1/2 
            for(i=h;i<length;i++){ //从array[h]开始,往后。第一次即从中间位置往后开始,第二次往后挪一位
                temp=array[i];    //保存数据至temp
                for(j=i-h;j>=0;j=j-h){  //第一次j从0开始,结束该循环。第二次进入该循环j从1开始,因为i增加1了,这段代码保证每次都是步长为h的两个数据在比较
                    if(temp<array[j]){    //如果发现比temp大的数据,将该数据放置在位置array[j+h]
                        array[j+h]=array[j];
                    }else{
                        break;
                    }
                }
                array[j+h]=temp;
            }
        }
    }
    public static void main(String[] args){
        int a[]={2,9,0,8,7,1,5,4,3,6};
        shellSort(a);
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }
    }
}

 

【总结】

希尔排序的关键并不是随便的分组后各自排序,而是将相隔某个“步长”的数据组成一个新的子序列,实现跳跃式移动,使得排序的效率提高。

https://i.cnblogs.com/EditPosts.aspx?postid=5716868&update=1

posted @ 2016-07-29 00:48  HigginCui  阅读(266)  评论(1编辑  收藏  举报