• 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 入门 9 Random 类 随机数
    Java 入门16 面向对象实现之前的小案例购物车
    Java 入门10 java的内存分配,数组内存图( 方法区 栈内存 堆内存)
    JAVA 12 联系回顾之前知识
    Java 13 面向对象的编程 小案例 实现购物车
    面试泛型
    面试反射
    从HashMap的执行流程开始 揭开HashMap底层实现
    面试什么是面向对象?面向对象三大特性?
    面试JMM内存模型
  • 原文地址:https://www.cnblogs.com/isalo/p/13095238.html
Copyright © 2020-2023  润新知