zoukankan      html  css  js  c++  java
  • shell排序

    1.shell排序简介

    希尔排序按其设计者希尔(Donald Shell)的名字命名,它是一种基于插入排序的快速排序算法,要了解希尔排序,必须先掌握插入排序的原理与实现。

    希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

    步长的选择是希尔排序的重要部分。只要最终步长为1任何步长序列都可以工作(且步长要小于数组长度)。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序


    2.shell排序图解
    在这里插入图片描述

    3.代码

    public class ShellSort {
        public static void main(String[] args) {
            int[] arr = {8,9,1,7,2,3,5,4,6,0};
            shellSort1(arr);
            shellSort2(arr);
        }
    
        /**
         * 交换法实现shell排序
         * @param arr
         */
        public static void shellSort1(int[] arr){
            System.out.println("交换法实现shell排序:");
            //用于交换
            int temp = 0;
            //确定每组元素的数目,gap为每组元素的数目
            for (int gap = arr.length/2;gap>0;gap /= 2){
    
                //对元素进行分组,每组元素个数i<arr.length
                //i++:第gap个数后面的所有数都要判断是否交换
                for (int i=gap;i<arr.length;i++){
                    //遍历每组的元素,判断其是否交换
                    for (int j = i-gap;j>=0;j -= gap){
                        //如果后前面的元素大于后面的元素,则交换
                        if (arr[j] > arr[j+gap]){
                            temp = arr[j];
                            arr[j]=arr[j+gap];
                            arr[j+gap]=temp;
                        }
                    }
                }
                System.out.println(Arrays.toString(arr));
            }
        }
    
        /**
         * 交换法实现shell排序
         * @param arr
         */
        public static void shellSort2(int[] arr){
            System.out.println("交换法实现shell排序:");
            for (int gap = arr.length/2;gap>0;gap /= 2){
                for (int i = gap;i<arr.length;i++){
                    int j = i;
                    int temp = arr[j];
                    if (arr[j]<arr[j-gap]){
                        while (j-gap>=0&&temp<arr[j-gap]){
                            arr[j] = arr[j-gap];
                            j -= gap;
                        }
                        arr[j]=temp;
                    }
                }
                System.out.println(Arrays.toString(arr));
            }
        }
    }
  • 相关阅读:
    Java NIO类库Selector机制解析(上)
    SWT Display.getDefault() 和Display.getCurrent()的区别
    VSS 2005 复位 工作目录(Reset Working Folder)
    转:理解javascript中的delete机制(2)
    在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
    CSS样式
    Character Animator不显示NDI无法OBS直播
    【LoadRunner】基础使用教程:录制第一个脚本(包含遇到的错误问题解决)
    流式传输 之四流式协议
    全局变量,静态变量,局部变量
  • 原文地址:https://www.cnblogs.com/isalo/p/13095238.html
Copyright © 2011-2022 走看看