首页 > 系统相关 >希尔排序(Shell Sort)

希尔排序(Shell Sort)

时间:2024-03-23 19:22:05浏览次数:22  
标签:Sort arr Shell min int 间隔 gap 排序 插入排序

public static void main(String[] args) {
    int[] arr = {9, 6, 8, 4, 2, 5, 7, 3, 1};
    int[] arr2 = {9, 6, 8, 4, 2, 5, 7, 3, 1};
    shellSort(arr);
    System.out.println("=====================");
    shellSort2(arr2);
}

/**
 * shell排序,插入排序的优化
 * 最终也是使用插入排序,区别就是找到间隔数,可以理解插入排序就是间隔为1的shell排序
 * 其实可以这样理解,把gap换成1,代入就行了,只有gap是需要变换的,其他代码就是插入排序的代码
 * 复杂度O(n^1.3)
 * @param arr
 */
private static void shellSort(int[] arr) {
    for (int gap = arr.length / 2; gap > 0; gap /= 2){
        for (int i = gap; i < arr.length; i++) {
            int min = arr[i];
            int j = i - gap;
            while (j >= 0 && min < arr[j]) {
                arr[j + gap] = arr[j];
                j -= gap;     //每次j就是减去gap个间隔数,其实gap是1的话就是j--
            }
            if (arr[j + gap] != min) {    //如果相等,可不用替换,这样就可以减少替换的次数
                arr[j + gap] = min;
                System.out.println(Arrays.toString(arr));
            }
        }
    }
}


/**
 * shell排序,for循环的形式
 * @param arr
 */
private static void shellSort2(int[] arr) {
    //表示每次的间隔是原来的一半,这样最终的间隔一定会有1的间隔
    int temp = 0;
    for (int gap = arr.length / 2; gap > 0 ; gap /= 2) {
        for (int i = gap; i < arr.length; i++) {
            for (int j = i; j > gap - 1 ; 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));
                }
            }
        }
    }
}

标签:Sort,arr,Shell,min,int,间隔,gap,排序,插入排序
From: https://www.cnblogs.com/Houqz/p/18091568

相关文章

  • shell检测文件是windows格式还是unix
    Shell可以检测文件是Windows格式还是Unix格式。有多种方法可以实现这一目的。一种常用的方法是使用cat命令结合-A选项来查看文件的特殊字符。在Unix或Linux系统中,如果文件的行尾是以^M$结束的,那么它就是Windows(DOS)格式,因为^M代表回车符(\r)。而如果行尾只是以$结束,那么它就是Unix格......
  • java数据结构与算法基础-----排序------堆排序
    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846文章目录堆排序是利用堆(数据结构)设计的排序算法,属于选择排序,最坏,最好,平均时间复杂度均为O(nlogn),不稳......
  • 排序合集模板
    #include<bits/stdc++.h>usingnamespacestd;constintN=1005;inta[N];intt[N];intn;voidbubbleSort(inta[],intn){//冒泡排序://时间复杂度:O(n^2)//是否稳定:是 for(inti=n;i>1;i--){ for(intj=1;j<i;j++){ if(a[j]>a[j+1]){......
  • 【LeetCode-153.寻找旋转排序数组的最小值】
    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0],a[1],a[2],...,a[n-1......
  • 嵌入式开发学习---Linux所有命令、shell命令
    Linux命令系统维护命令df命令df-Th:查看磁盘使用情况文件系统 文件类型大小已使用可用使用比例挂载点FilesystemTypeSizeUsedAvailUse%Mountedon/dev/sda1ext419G6.6G12G38%/mount......
  • 快速排序的原理及其多种方法的实现和优化
    ✨✨✨学习的道路很枯燥,希望我们能并肩走下来!文章目录前言一、快速排序介绍二、快速排序实现的方法(升序)1.hoare版本:2.挖坑法3.前后指针法  三、快速排序的优化1.关于所排序的数据有序或接近有序的问题1.1随机取key方法1.2三数取中法2.关于递归深度过深导......
  • 十大经典排序之计数排序
    文章目录概要整体架构流程代码实现小结概要计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。整体架构流程(1)找出待排序的数组中最大和最小的元素(2)统计数组中每......
  • Shell 中 $ 关于脚本参数的几种用法
    基本语法$n   (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})$#   (功能描述:获取所有输入参数个数,常用于循环)。$*   (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)$@ (功能描......
  • Java - 冒泡排序
      //冒泡排序publicclassBubbleSort{ publicstaticvoidmain(String[]args){ //定义一个整型的数组 int[]array={64,34,25,12,22,11,90} bubbleSort(array); for(inti:array){ System.out.println(i+""); } } publicstaticvoidbubbl......
  • SpringBoot3.x与SpringDoc OpenApi之Swagger接口排序
    直接使用Swagger之后,发现所有的Controller接口菜单都是无序的先看一下效果 就是利用了一下SpringDoc提供的接口做了一下自定义排序1.在Controller上加上注解@Tag(name="MenuController",description="1-菜单管理")这里需要注意description属性,在下面的代码里......