Java 插入排序之希尔排序

Java 插入排序之希尔排序

  • 希尔排序是直接插入排序的优化改进版(更高效,也称为缩小增量排序),把数组按 gap 间隔(步长、增量)分成多个子序列,对每个子序列分别进行直接插入排序
  • 初始间隔通常为数组长度的一半,然后逐步缩小间隔,随着数组逐步趋于有序,数据移动的次数逐步减少,直到最后间隔为 1,最终实现高效排序
  • 希尔排序在性能上显著优于直接插入排序,适合中等规模数据,尤其是部分有序的数据
  • 时间复杂度:平均 优于 O(n^2) 最好 O(n log n) 最坏 O(n^2)
  • 空间复杂度:O(1)
  • 稳定性:不稳定
java 复制代码
public static void main(String[] args) {
    int[] arr = {3, 5, 1, 7, 6, 2, 4};
    //初始间隔为数组长度的一半
    int gap = arr.length / 2;
    while (gap >= 1) {
        //对每个间隔为 gap 的子序列进行直接插入排序
        for (int i = gap; i < arr.length; i++) {
            int key = arr[i]; //当前待插入元素 key
            int j = i - gap;
            //从后向前比较,找到插入位置并移动元素(将已排序部分中比 key 大的元素后移 gap 个位置)
            while (j >= 0 && arr[j] > key) {
                arr[j + gap] = arr[j];
                j -= gap;
            }
            //插入 key
            arr[j + gap] = key;
        }
        //逐步缩小间隔
        gap = gap / 2;
    }
    //
    System.out.println("排序后的数组:");
    for (int num : arr) {
        System.out.print(num + " ");
    }
}
//---------------------------------
排序后的数组:
1 2 3 4 5 6 7 
相关推荐
徐子童38 分钟前
《Spring Cloud Gateway 快速入门:从路由到自定义 Filter 的完整教程》
java·开发语言·spring cloud·nacos·gateway
Maxwellhang2 小时前
【音频处理】java流式调用ffmpeg命令
java·ffmpeg·音视频
Maỿbe3 小时前
阻塞队列的学习以及模拟实现一个阻塞队列
java·数据结构·线程
we风4 小时前
【SpringCache 提供的一套基于注解的缓存抽象机制】
java·缓存
趙卋傑6 小时前
网络编程套接字
java·udp·网络编程·tcp
两点王爷6 小时前
Java spingboot项目 在docker运行,需要含GDAL的JDK
java·开发语言·docker
万能螺丝刀18 小时前
java helloWord java程序运行机制 用idea创建一个java项目 标识符 关键字 数据类型 字节
java·开发语言·intellij-idea
zqmattack8 小时前
解决idea与springboot版本问题
java·spring boot·intellij-idea
Hygge-star8 小时前
【Java进阶】图像处理:从基础概念掌握实际操作
java·图像处理·人工智能·程序人生·职场和发展
Honmaple8 小时前
IDEA修改JVM内存配置以后,无法启动
java·ide·intellij-idea