zoukankan      html  css  js  c++  java
  • 希尔排序

    希尔排序

    • 概念

       希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至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]
        }
    
    }

     

     

     

  • 相关阅读:
    【BZOJ4517】[SDOI2016] 排列计数(组合数)
    【BZOJ4818】[SDOI2017] 序列计数(矩乘水题)
    【BZOJ4872】[SHOI2017] 分手是祝愿(思维+动态规划)
    【BZOJ4821】[SDOI2017] 相关分析(线段树)
    【BZOJ2710】[Violet 1] 追风者(计算几何)
    【BZOJ3199】[SDOI2013] escape(半平面交+BFS)
    【BZOJ1007】[HNOI2008] 水平可见直线(几何)
    【BZOJ3689】异或之(可持久化Trie树)
    【BZOJ3261】最大异或和(可持久化Trie树水题)
    NOI Online #3 提高组 小记
  • 原文地址:https://www.cnblogs.com/javaisbest/p/12977290.html
Copyright © 2011-2022 走看看