首页 > 编程语言 >算法——初级排序算法之希尔排序

算法——初级排序算法之希尔排序

时间:2023-08-10 16:31:51浏览次数:31  
标签:Comparable int void 希尔 private 算法 static 数组 排序

介绍&特点

对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,元素只会一点一点地从数组一端移到另一端。例如,如果主键最小的元素正好在数组的尽头,要将它挪到正确的位置就需要N-1次移到。希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

通过提升速度来解决其他方式无法解决的问题是研究算法的设计和性能的主要原因之一

代码

public class HillSort {

    public static void main(String[] args) {
        Integer[] arr = {1, 2, 3, 4, 5, 22, 2, 12, 13, 21, 9};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void sort(Comparable[] a) {
        int N = a.length;
        int h = 1;
        while (h < N / 3) {
            h = 3 * h + 1;
        }
        while (h >= 1) {
            // 将数组变为h有序
            for (int i = h; i < N; i++) {
                // 将a[i] 插入到a[i-h], a[i-2*h], a[i-3*h] 之中
                for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) {
                    exchange(a, j, j - h);
                }
                h = h / 3;
            }
        }
    }

    // 比较v是否小于w
    private static boolean less(Comparable v, Comparable w) {
        return v.compareTo(w) < 0;
    }

    private static void exchange(Comparable[] a, int i, int j) {
        Comparable t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

    private static void show(Comparable[] a) {
        for (Comparable comparable : a) {
            System.out.println("a[i]= " + comparable);
        }
    }

    private static boolean isSorted(Comparable[] a) {
        for (int i = 1; i < a.length; i++) {
            if (less(a[i], a[i - 1])) {
                return false;
            }
        }
        return true;
    }
}

标签:Comparable,int,void,希尔,private,算法,static,数组,排序
From: https://blog.51cto.com/u_11906056/7037191

相关文章

  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    704二分查找题目给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。第一想法判断条件是value=target因为数组是升序,其实每种查找方法应该相差不大?不过题目都标了二分查找了emmm思......
  • 【通知】有三AI更新420页14万字视觉算法工程师成长指导手册,可下载收藏打印...
    各位同学,可还记得我们发布的《深度学习视觉算法工程师成长指导手册》,现在更新了,超过14万字,420页文档,可下载收藏打印,目录如下,文末提供了下载方式。手册简介目前深度学习在图像,语音,NLP领域大展拳脚,不管是本专业还是非本专业的技术人员都有很多人投身这一行,但是学校的学科建设刚刚开始......
  • manacher(马拉车)算法C++详解
    马拉车的定义马拉车本质是对中心扩展法(暴力算法)的优化。马拉车是干什么的Manacher算法帮助我们在给定的字符串中找到最长的回文子串。为了简单起见,我们先只处理有奇数个字符的字符串,关于偶数个字符的字符串,在文章最后会给出解法。我们的处理思路和暴力算法基本一致,那就是从左......
  • 单源次短路算法 学习笔记
    次短路:顾名思义就是一张图中第二短的路径。分类:1.边不可重复经过的次短路问题。边可重复经过的次短路问题。2.严格次短路(次短路长度必须大于最短路长度)。非严格次短路(次短路长度可以大于或等于最短路长度)。一、边不可重复经过的次短路问题例题:LuoguP1491集合位置题目分析......
  • 关于读者阅读“改良版雪花算法”后提出的几个共性问题的回复
    你好呀,我是歪歪。周一的时候不是发了《在开源项目中看到一个改良版的雪花算法,现在它是你的了。》这篇破文章嘛。然后有好几个读者都提出了几个类似的问题,再写个续集,给大家解答一下。我就喜欢这种和读者有来有回,相互拉扯的感觉。突出一个“相互学习,共同进步。”超前消费首先......
  • 代码随想录算法训练营第十天|力扣232.用栈实现队列、力扣225.用队列实现栈
    栈与队列理论知识栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set或者map提供迭代器iterator来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制......
  • 代码随想录算法训练营第十四天| 理论基础 递归遍历 迭代遍历
     理论基础    卡哥建议:需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义   文章讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html   补充的知识点:   名词的概念看卡哥文章。二叉树......
  • 单源最短路径算法
    单源最短路径算法1.原理单源最短路径算法是一种用于在有向图或无向图中找到从指定源节点到其他所有节点的最短路径的算法。常用的单源最短路径算法有Dijkstra算法、Floyd-Warshall算法和Bellman-Ford算法。2.Dijkstra算法Dijkstra算法是最常用的单源最短路径算法之一,它的基......
  • (未完全掌握)代码随想录算法训练营第八、九天|KMP算法;力扣28.实现strStr(),力扣459.重
    KMP算法(没掌握)主要功能:字符串匹配理论:检测文本串中是否出现过模式串前缀就是包含首字母不包含尾字母的所有子串后缀就是包含尾字母不包含首字母的所有子串最长相等前后缀:对子串分别分析,从左向右前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从......
  • Floyd 算法
    Floyd算法:动态规划中的最短路径问题一、简介Floyd算法是一种用于求解图中所有顶点对之间最短路径的动态规划算法。它是由RobertW.Floyd在1965年提出的,因此得名Floyd-Warshall算法。该算法的核心思想是使用动态规划来避免重复计算已经计算过的子问题的解。二、原理假......