图解Java排序算法之希尔排序

图解Java排序算法之希尔排序:完整攻略

什么是希尔排序

希尔排序(Shell Sort),又称递减增量排序法,是插入排序的一种更高效的改进版本。希尔排序是将整个序列分成若干子序列,对于每个子序列进行直接插入排序,减小增量再次排序,循环直至增量为1。

希尔排序的原始实现

首先看一下希尔排序的原始实现(不采用递归实现):

public static void shellSort(int[] arr) {
    int n = arr.length;
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            for (int j = i; j >= gap && arr[j - gap] > arr[j]; j -= gap) {
                // 交换位置
                int temp = arr[j];
                arr[j] = arr[j - gap];
                arr[j - gap] = temp;
            }
         }
    }
}

希尔排序的优化实现

1. Knuth序列增量

希尔本人给出的增量序列为:d1=n/2, di=di-1/2 。但实际上这个增量序列并不是最优的,Knuth提出了一种增量序列:d1=1,di=3*di-1+1 。这个增量序列可以取到 O(n^1.25) 的时间复杂度。

我们可以将原始实现中的for循环修改一下即可:

public static void shellSort(int[] arr) {
    int n = arr.length;
    int gap = 1;
    while (gap < n / 3) {
        gap = gap * 3 + 1;
    }
    for (; gap > 0; gap /= 3) {
        for (int i = gap; i < n; i++) {
            for (int j = i; j >= gap && arr[j - gap] > arr[j]; j -= gap) {
                // 交换位置
                int temp = arr[j];
                arr[j] = arr[j - gap];
                arr[j - gap] = temp;
            }
         }
    }
}

2. 使用插入排序

希尔排序可以看作是插入排序的一种优化版,我们可以在内层循环中使用插入排序,并且使用直接插入排序的优化,这样可以进一步提升排序效率。示例代码如下:

public static void shellSort(int[] arr) {
    int n = arr.length;
    int gap = 1;
    while (gap < n / 3) {
        gap = gap * 3 + 1;
    }
    for (; gap > 0; gap /= 3) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j = i - gap;
            while (j >= 0 && arr[j] > temp) {
                arr[j + gap] = arr[j];
                j -= gap;
            }
            arr[j + gap] = temp;
        }
    }
}

示例说明

示例1

假设有一个数组arr,其值为{3, 7, 2, 1, 9, 5, 8, 4}。我们对其进行希尔排序,使用增量序列d1=1, di=3*di-1+1。

  1. gap=4,将整个序列分成了4组:3 9、7 5、2 8、1 4,对每一组进行插入排序,得到{3, 5, 2, 1, 9, 7, 8, 4};
  2. gap=1,将整个序列分成了1组:3 5 2 1 9 7 8 4,对整个序列进行插入排序,得到{1, 2, 3, 4, 5, 7, 8, 9}。

最终的排序结果为{1, 2, 3, 4, 5, 7, 8, 9}。

示例2

假设有一个数组arr,其值为{9, 1, 5, 8, 3, 7, 4, 6, 2}。我们对其进行希尔排序,使用增量序列d1=4,d2=2,d3=1。

  1. gap=4,将整个序列分成了两组:9 3 4 2 与 1 5 7 6 8,对每一组进行插入排序,得到{2, 3, 4, 6, 1, 5, 7, 9, 8};
  2. gap=2,将整个序列分成了两组:2 4 1 7 8 与 3 6 5 9,对每一组进行插入排序,得到{1, 2, 4, 5, 3, 6, 7, 9, 8};
  3. gap=1,整个序列为{1, 2, 4, 5, 3, 6, 7, 9, 8},对其进行插入排序,得到{1, 2, 3, 4, 5, 6, 7, 8, 9}。

最终的排序结果为{1, 2, 3, 4, 5, 6, 7, 8, 9}。

阅读剩余 55%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图解Java排序算法之希尔排序 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringMVC实现Validation校验过程详解

    以下是关于“SpringMVC实现Validation校验过程详解”的完整攻略,其中包含两个示例。 SpringMVC实现Validation校验过程详解 在SpringMVC中,我们可以使用Validation校验来验证表单数据的合法性。在本文中,我们将讲解如何使用SpringMVC实现Validation校验。 Validation校验实现原理 Spri…

    Java 2023年5月17日
    00
  • Mysql存储java对象实例详解

    MySQL是一种流行的关系型数据库,而Java是一种流行的编程语言。如果你正在使用Java编写应用程序,那么你可能需要在MySQL中存储Java对象实例。本文将详细介绍如何将Java对象存储到MySQL中的方法。 环境和实例准备 环境 操作系统:Windows 10 Java版本:1.8 MySQL版本:8.0 实例 我们将使用一个简单的Java类作为例子,…

    Java 2023年5月26日
    00
  • PHP、Java des加密解密实例

    PHP、Java des加密解密实例攻略 简介 DES(Data Encryption Standard)是一种对称加密算法,广泛应用于信息安全领域中的数据传输和文件加密。本攻略将介绍使用PHP和Java语言实现的DES加密解密算法。 环境准备 PHP版本:5.3及以上 Java版本:1.6及以上 IDE:PhpStorm、Eclipse、IntelliJ …

    Java 2023年5月19日
    00
  • 总结Java常用的时间相关转化

    转化为Date类型 String str = "2021-09-15 13:30:00"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime = LocalDa…

    Java 2023年5月20日
    00
  • Spring利用注解整合Mybatis的方法详解

    对于“Spring利用注解整合Mybatis的方法详解”的攻略,我会进行以下步骤进行讲解: 1. 添加Mybatis和Spring的依赖 在项目的pom.xml中添加以下依赖: <!– Mybatis依赖 –> <dependency> <groupId>org.mybatis</groupId> <…

    Java 2023年5月20日
    00
  • SpringMVC请求流程源码解析

    SpringMVC请求流程源码解析 概述 SpringMVC是目前比较受欢迎的MVC框架之一,其请求的处理流程应该是每一个开发人员必须掌握的知识。 在SpringMVC中,一个请求的处理流程大致可以分为: 前端控制器(DispatcherServlet)接收请求 根据请求的URL查找对应的HandlerMapping 根据HandlerMapping找到对应…

    Java 2023年5月16日
    00
  • Java实现的Base64加密算法示例

    好的!本文将为大家详细讲解如何使用Java实现Base64加密算法,包括编写代码和运行示例,让您能够更好地理解这一加密算法。 什么是Base64加密算法? Base64是一种将二进制数据编码成ASCII字符的编码方式,通常用于对二进制数据进行可读、可传输的编码操作。它是一种通过将二进制数据处理成文本格式的方法,不包含加密和解密操作。 Base64编码会将二进…

    Java 2023年5月20日
    00
  • Java数据类型之细讲char类型与编码关系

    Java数据类型之细讲char类型与编码关系 char类型的定义 Java中的char类型用于表示一个16位的Unicode字符,也可以理解成一个字符编码所对应的字符。char类型在Java中是一种基本的数据类型,其关键字为char,它的取值范围为0~65535。 char类型与编码关系 在计算机系统中,关于字符的存储一般有两种方案: ASCII编码 在美国…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部