数据结构 | 排序算法总结——(三)希尔排序排序(附Java实现代码)

简介: 数据结构 | 排序算法总结——(三)希尔排序排序(附Java实现代码)

1.2.3希尔排序

希尔排序又叫缩小增量排序

基本思想:先取一个小于n的整数作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

具体算法步骤:

  • 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列个数k,对序列进行k 趟排序;
  • 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

实例:image.png

空间效率:仅使用常数个辅助单元,因而空间复杂度为O(1)

时间效率:最坏情况下希尔排序的时间复杂度为O(n^2)

稳定性:相同关键字的记录被划分到不同的子表时,可能会改变它们之间的相对次序,所以是不稳定的排序方法

适用性:仅适用于当线性表为顺序存储的情况

import java.util.Scanner;
import java.util.Arrays;
public class ShellSort {
    public static void shellInsert(int[] arr) {
        for (int dis = arr.length/2;dis>0;dis = dis/2){
            for (int i=dis;i<arr.length;i++){
                // 开始组内比较
                int temp = arr[i];
                int j = i-dis;
                while (j>=0 && temp < arr[j]){   // 前面的比后面的大,则交换位置
                    arr[j+dis] = arr[j];   // 大的放到后面来
                    j = j - dis;    
                }
                arr[j+dis] = temp;
            }
        }
        System.out.println("希尔排序:"+Arrays.toString(arr));
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//Scanner工具类键盘输入数据
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            if (n > 0) {
                int arr[] = new int[n];
                for (int i = 0; i < n; i++) {
                    arr[i] = scanner.nextInt();
                }
                shellInsert(arr);//调用希尔排序shellInsert方法
            }
        }
    }
}
相关文章
|
5天前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
29 11
|
3天前
|
并行计算 Java 开发者
探索Java中的Lambda表达式:简化代码,提升效率
Lambda表达式在Java 8中引入,旨在简化集合操作和并行计算。本文将通过浅显易懂的语言,带你了解Lambda表达式的基本概念、语法结构,并通过实例展示如何在Java项目中应用Lambda表达式来优化代码,提高开发效率。我们将一起探讨这一现代编程工具如何改变我们的Java编码方式,并思考它对程序设计哲学的影响。
|
3天前
|
安全 Java 测试技术
掌握Java的并发编程:解锁高效代码的秘密
在Java的世界里,并发编程就像是一场精妙的舞蹈,需要精准的步伐和和谐的节奏。本文将带你走进Java并发的世界,从基础概念到高级技巧,一步步揭示如何编写高效、稳定的并发代码。让我们一起探索线程池的奥秘、同步机制的智慧,以及避免常见陷阱的策略。
|
10天前
|
Java API 开发者
代码小妙招:用Java轻松获取List交集数据
在Java中获取两个 `List`的交集可以通过 `retainAll`方法和Java 8引入的流操作来实现。使用 `retainAll`方法更为直接,但会修改原始 `List`的内容。而使用流则提供了不修改原始 `List`、更为灵活的处理方式。开发者可以根据具体的需求和场景,选择最适合的方法来实现。了解和掌握这些方法,能够帮助开发者在实际开发中更高效地处理集合相关的问题。
10 1
|
搜索推荐 Java
各种Java实现的常用排序算法
各种Java实现的常用排序算法
|
机器学习/深度学习 算法 搜索推荐
|
算法 搜索推荐 Java
Java 实现的各种经典的排序算法小Demo
由于有上机作业,所以就对数据结构中常用的各种排序算法都写了个Demo,有如下几个: 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 选择排序 桶排序 Demo下载地址 下面谈一谈我对这几个排序算法的理解: 插入类算法 对于直接插入排序:(按从小到大的...
1482 0
|
算法 搜索推荐 Java
Java中实现的各种排序算法
Java中的冒泡排序算法 package cn.edu.hactcm; /**  * 冒泡排序算法  */ public class BubbleSortDemo { public static void main(String[] args) { int[] r = { 22, 12, 34, 123, 65, 34, 65, 34, 567, 3, 65, 546
1195 0
|
搜索推荐 Java Shell
用Java实现几种常见的排序算法
用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。
589 0
|
8天前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
64 6
【Java学习】多线程&JUC万字超详解