• 希尔排序


    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;
        }
    }

      

  • 相关阅读:
    php RSA公钥私钥加解密和验证用法
    php格式化RSA公钥私钥字符串
    你的周末时光是什么样的?
    php-redis 消息订阅笔记
    php redis 常用操作
    MySql索引笔记
    yii1框架,事务使用方法
    python 项目打包成exe可执行程序
    Linux修改默认端口
    C++字符串作为参数的传递
  • 原文地址:https://www.cnblogs.com/tcxpz/p/10588693.html
Copyright © 2020-2023  润新知