希尔排序(java实现)

一、概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

二、适用说明

希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。

三、过程图示

希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。

在此我们选择增量 gap=length/2,缩小增量以 gap = gap/2 的方式,用序列 {n/2,(n/2)/2…1} 来表示。

如图示例:

(1)初始增量第一趟 gap = length/2 = 4

希尔排序(java实现)

(2)第二趟,增量缩小为 2

希尔排序(java实现)

(3)第三趟,增量缩小为 1,得到最终排序结果

希尔排序(java实现)

四、Java 代码

ShellSort.java代码:


/**
 * 希尔排序
 */
public class ShellSort {

    public static void sort(Comparable[] arr) {
        int j;
        for (int gap = arr.length / 2; gap >  0; gap /= 2) {
            for (int i = gap; i < arr.length; i++) {
                Comparable tmp = arr[i];
                for (j = i; j >= gap && tmp.compareTo(arr[j - gap]) < 0; j -= gap) {
                    arr[j] = arr[j - gap];
                }
                arr[j] = tmp;
            }
        }
    }

    public static void main(String[] args) {

        int N = 20;
        Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 10);
        ShellSort.sort(arr);
        for( int i = 0 ; i < arr.length ; i ++ ){
            System.out.print(arr[i]);
            System.out.print(' ');
        }
    }
}

InsertionSort.java

/**
 * 插入排序
 */
public class InsertionSort {
    //核心代码---开始
    public static void sort(Comparable[] arr){

        int n = arr.length;
        for (int i = 0; i < n; i++) {
            // 寻找元素 arr[i] 合适的插入位置
            for( int j = i ; j > 0 ; j -- )
                if( arr[j].compareTo( arr[j-1] ) < 0 )
                    swap( arr, j , j-1 );
                else
                    break;
        }
    }
    //核心代码---结束
    private static void swap(Object[] arr, int i, int j) {
        Object t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
    public static void main(String[] args) {

        int N = 20;
        Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);
        InsertionSort.sort(arr);
        for( int i = 0 ; i < arr.length ; i ++ ){
            System.out.print(arr[i]);
            System.out.print(' ');
        }
    }

}

SelectionSort.java

/**
 * 选择排序
 */
public class SelectionSort {

    public static void sort(int[] arr){
        int n = arr.length;
        for( int i = 0 ; i < n ; i ++ ){
            // 寻找[i, n)区间里的最小值的索引
            int minIndex = i;
            for( int j = i + 1 ; j < n ; j ++ )
                if( arr[j] < arr[minIndex] )
                    minIndex = j;
            //数据交换不同索引位置数据
            swap( arr , i , minIndex);
        }
    }
    private static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
    public static void main(String[] args) {

        int[] arr = {10,9,8,7,6,5,4,3,2,1};
        SelectionSort.sort(arr);
        for( int i = 0 ; i < arr.length ; i ++ ){
            System.out.print(arr[i]);
            System.out.print(' ');
        }
        System.out.println();
    }
}

SortTestHelper.java


public class SortTestHelper {
    // SortTestHelper不允许产生任何实例
    private SortTestHelper(){}

    // 生成有n个元素的随机数组,每个元素的随机范围为[rangeL, rangeR]
    public static Integer[] generateRandomArray(int n, int rangeL, int rangeR) {

        assert rangeL

Original: https://www.cnblogs.com/siwuxiebuff/p/16208547.html
Author: 思无邪buff
Title: 希尔排序(java实现)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570275/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 异步线程中通过 HttpServletRequest#getRequestURI 有时拿到值,有时拿到 null

    由于 HttpServletRequest 不是线程安全的(后知后觉),当主线程完成自己的工作返回response后,相应的 HttpServletRequest 等对象就会被销毁…

    Java 2023年5月30日
    059
  • Apache DolphinScheduler新一代分布式工作流任务调度平台实战-上

    概述 定义 特性 名词 模块组成 部署 建议配置 下载 部署规划 前置准备工作 准备启动环境 修改配置文件 初始化数据库 启动 DolphinScheduler 实战使用 监控中心…

    Java 2023年6月5日
    068
  • 如何使用 RSA 加密 JWT

    <dependency> <groupid>com.nimbusds</groupid> <artifactid>nimbus-jo…

    Java 2023年6月7日
    080
  • 8种方法提升windows 8使用方便—–Win+x 编辑菜单

    在windows 8上,你可以同时按下windows键和x键或者右键点击屏幕左下角打开一个菜单名为电源菜单或者快速访问菜单,这个菜单包含快速访问系统的工具,如控制面板,命令提示符,…

    Java 2023年6月7日
    073
  • 最新一线大厂Redis使用21条军规及详细解读

    说明:个人原创,本人在一线互联网大厂维护着几千套集群,关于redis使用的一些坑进行了经验总结,希望能给大家带来一些帮助 适用场景:并发量大、访问量大的业务 规范:介绍军规内容 解…

    Java 2023年6月16日
    076
  • 大家都在用MySQL count(*)统计总数,到底有什么问题?

    在日常开发工作中,我经常会遇到需要统计总数的场景,比如:统计订单总数、统计用户总数等。一般我们会使用MySQL 的count函数进行统计,但是随着数据量逐渐增大,统计耗时也越来越长…

    Java 2023年6月8日
    066
  • java package(包)的用法

    一般来说都用eclipse自动化图形工具搞定,我用的是ubuntu,所以需要自己打包引入。 什么是包? 这是对java源代码的组织和管理的一种方式,比如:当操作系统某个目录的文件非…

    Java 2023年5月29日
    084
  • Java8之流Stream

    java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Ja…

    Java 2023年5月29日
    064
  • 【Java】Lucene检索引擎详解

    基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文…

    Java 2023年5月29日
    071
  • grep: memory exhausted, 记录一次日志查询问题

    今天某个项目的数据有些问题,需要查询日志看看具体的情况 结果在执行 cat .log |grep “关键字”* 命令后包如下错误: grep: memory…

    Java 2023年6月5日
    073
  • Spring bean的作用域

    The scope of this bean: typically "singleton" (one shared instance, which will b…

    Java 2023年5月30日
    083
  • ViewGroup 和 View 事件传递及处理小谈

    在自定义组件的时候少不了会去处理一些事件相关的东西,关于事件这块网上有很多文章,有说的对的也有说的不对的,我在理解的时候也有过一段时间的迷惑,现在把自己理解的东西写下来,给有相同疑…

    Java 2023年6月7日
    055
  • windows使用nginx实现网站负载均衡测试实例

    如果你关注过nginx,必定知道nginx这个软件有什么用的,如果你的网站访问量越来越高,一台服务器已经没有办法承受流量压力,那就增多几台服务器来做负载吧。做网站负载可以买硬件设备…

    Java 2023年5月30日
    056
  • 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!

    作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper。 Mybatis G…

    Java 2023年6月9日
    056
  • md-resume-demo

    小明 概况: 6&#x5E74;&#x5DE5;&#x4F5C;&#x7ECF;&#x9A8C; | 男 | 26岁(1990年5月16日)…

    Java 2023年6月5日
    0310
  • jvm垃圾回收的过程

    垃圾回收的过程分为两步: 1.判断对象是否死亡 (1)引用计数器法: ①每当有一个对象引用是,计数器加一,当计数器为0是对象死亡 ②缺点:无法解决循环引用的问题,假设A引用B,B引…

    Java 2023年6月6日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球