0基础学C#笔记09:希尔排序法

文章目录


前言

希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它挪到正确的位置就需要 n - 1 次移动。也就是说,原数组的一个元素如果距离它正确的位置很远的话,则需要与相邻元素交换很多次才能到达正确的位置,这样是相对比较花时间了。希尔排序就是为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序。

一、希尔排序的思想

采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。

为方便理解我还准备了图片:

如果还是不懂的话我还给你准备了优质的文章讲解:希尔排序

二、使用步骤

csharp 复制代码
public class ShellSort {
    public static int[] shellSort(int arr[]) {
        if (arr == null || arr.length < 2) return arr;
        int n = arr.length;
        // 对每组间隔为 h的分组进行排序,刚开始 h = n / 2;
         for (int h = n / 2; h > 0; h /= 2) {
            //对各个局部分组进行插入排序
             for (int i = h; i < n; i++) {
                // 将arr[i] 插入到所在分组的正确位置上
                insertI(arr, h, i);
            }
     }
     return arr;
    }

    /**
     * 将arr[i]插入到所在分组的正确位置上
     * arr[i]] 所在的分组为 ... arr[i-2*h],arr[i-h], arr[i+h] ...
     */
    private static void insertI(int[] arr, int h, int i) {
        int temp = arr[i];
        int k;
        for (k = i - h; k > 0 && temp < arr[k]; k -= h) {
            arr[k + h] = arr[k];
        }
        arr[k + h] = temp;
    }
}

总结

需要注意的是,对各个分组进行插入的时候并不是先对一个组排序完了再来对另一个组排序,而是轮流对每个组进行排序。

性质:

1、时间复杂度:O(nlogn)

2、空间复杂度:O(1)

3、非稳定排序

4、原地排序

相关推荐
gis开发之家4 小时前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码
进击的丸子4 小时前
虹软人脸服务器SDK-C++语言Demo实操指南
后端·算法
兰令水4 小时前
hot100【acm版】【2026.7.25/26打卡-java版本】
java·算法·排序算法
quanjui4 小时前
【医学尝试】基于Segment Anything Model的医学图像分割研究:眼底OCT与X线胸片微调实战
人工智能·笔记·学习
小黄蚁4 小时前
FreeRTOS学习笔记(十二)
笔记·学习
茯苓gao5 小时前
嵌入式开发笔记:电机参数辨识与自学习完全指南——从电气参数到机械特性的深度解析
笔记·嵌入式硬件·学习
音视频工程实战5 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
wabs6665 小时前
关于图论【卡码网104.建造最大岛屿的思考】
数据结构·算法·图论
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练:【排序算法】案例9:成绩排序
c++·排序算法·csp·高频考点·信奥赛·成绩排序
优化Henry5 小时前
学习笔记之VoNR语音业务注册流程
网络·笔记·学习·5g·信息与通信