希尔排序

希尔排序

  • 概念

   希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

 

  • 步骤

    在网上看到一个很不错的例子,分享一下:https://blog.csdn.net/qq_39207948/article/details/80006224

    首先,将数组中的元素按下标间距为4分组,即array[0]和array[4]一组,array[1]和array[5]一组,以此类推,间距4就被称为增量;第一个增量一般是数组长度的一半

    

     对分好的组进行插入排序,各组就变得有序了;并按照小元素在前面,大元素在后面重新排列数组

       

     然后,将增量变为原来的一半,也就是2,再重新分组:

 

    

     对新分组进行插入排序,并重新排列数组:

       

     再将增量变为原来的一半,也就是1;当增量为1时,也意味着希尔排序到了最后一步:

     

 

 

 

      增量为1时就只剩下一个组了,直接对该组进行插入排序,这一组的数据也就完成了排序

 

  • Java代码实现

 

public class ShellSort {
    public void shellSort(Integer arr[]){
        //先判断数组元素是否只有一个以下,若只有一个就不用排序
        if(arr.length<=1)return;
        //定义增量
        int increase = arr.length/2;
        //判断增量是否到1了,没到1就进行排序
        while(increase>=1){
            for(int i=0;i<arr.length;i++){
                //进行插入排序
                for(int j=i;j<arr.length-increase;j=j+increase){
                    if(arr[j]>arr[j+increase]){
                        int temp = arr[j];
                        arr[j] = arr[j+increase];
                        arr[j+increase] = temp;
                    }
                }
            }
            //一次增量完成,设置新的增量
            increase = increase/2;
        }
    }
    public static void main(String[] args) {
        Integer arr[] = {9,1,3,5,6,4};
        System.out.println("排序前的数组:"+Arrays.toString(arr));
        ShellSort shellSort = new ShellSort();
        shellSort.shellSort(arr);
        System.out.println("排序后的数组:"+Arrays.toString(arr));
        //最终输出结果:
        //排序前的数组:[9, 1, 3, 5, 6, 4]
        //排序后的数组:[1, 3, 4, 5, 6, 9]
    }

}

 

 

 

 

 

posted @ 2020-05-27 23:01  发育中的程序猿  阅读(185)  评论(0编辑  收藏  举报