希尔排序

1 基本思想 

  1)设待排序元素序列有n个元素,首先取一个整数increment(小于n)作为间隔将全部元素分为increment个子序列,所有距离为increment的元素放在同一个子序列中,在每一个子序列中分别实行直接插入排序。然后缩小间隔increment,重复上述子序列划分和排序工作。直到最后取increment=1,将所有元素放在同一个子序列中排序为止。
  2)由于开始时,increment的取值较大,每个子序列中的元素较少,排序速度较快,到排序后期increment取值逐渐变小,子序列中元素个数逐渐增多,但由于前面工作的基础,大多数元素已经基本有序,所以排序速度仍然很快。

2 基本步骤

  我们来看下希尔排序的基本步骤,在此我们选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。希尔排序的增量序列的选择与证明是个数学难题,我们选择的这个增量序列是比较常用的,也是希尔建议的增量,称为希尔增量,但其实这个增量序列不是最优的。此处我们做示例使用希尔增量。

  

3 动画演示

  

4 参考代码 

package com.tcxpz.shell;
/**
 * 希尔排序
 * @author jgp QQ:1072218420
 *
 */
public class ShellSort {
    public static void main(String []args){
        int[] arr = new int[]{8,9,1,7,2,3,5,4,6,0};
        System.out.print("排序前:");
        for(int num:arr)
            System.out.print(num+" ");
        System.out.println();
        //进行排序
        int[] bubble_arr = sort(arr);
        System.out.print("排序后:");
        for(int num:bubble_arr)
            System.out.print(num+" ");
    }
    //希尔排序
    public static int[] sort(int []arr){
        //增量gap,并逐步缩小增量
       for(int gap=arr.length/2;gap>0;gap/=2){
           //从第gap个元素,逐个对其所在组进行直接插入排序操作
           for(int i=gap;i<arr.length;i++){
               int j = i;
               while(j-gap>=0 && arr[j]<arr[j-gap]){
                   //插入排序采用交换法
                   int temp = arr[j];
                   arr[j] = arr[j-gap];
                   arr[j-gap] = temp;
                   j-=gap;
               }
           }
       }
       return arr;
    }
}

 

  

posted @ 2019-07-12 10:31  糖醋小瓶子  阅读(216)  评论(0编辑  收藏  举报