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

这篇具有很好参考价值的文章主要介绍了0基础学C#笔记09:希尔排序法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

一、希尔排序的思想

采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,接着让 h = n / 4,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。
为方便理解我还准备了图片:
0基础学C#笔记09:希尔排序法,0基础学习C#笔记,笔记,排序算法,算法
如果还是不懂的话我还给你准备了优质的文章讲解:希尔排序

二、使用步骤

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、原地排序文章来源地址https://www.toymoban.com/news/detail-646783.html

到了这里,关于0基础学C#笔记09:希尔排序法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 考研算法29天:希尔排序 【希尔排序】

    算法介绍 希尔排序 = 等差数列 + 普通版插入排序 循环数组 第一次每n/2为间隔分为4组,然后组内排序。 第二次每n/4为间隔分为2组。然后组内排序 第三次n/8为间隔分为一组。然后组内排序。 组内排序用插入排序来排序。 注:也可以第一次为n/3为间隔,第二次为n/3^2,,第三次

    2024年02月11日
    浏览(35)
  • 【算法】排序——插入排序及希尔排序

    目录 前言 一、排序的概念及其应用 1.1排序的概念 1.2排序的应用 1.3常见的排序算法 二、插入排序的实现  基于插入排序的优化——希尔排序(缩小增量排序    ========================================================================= 个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏

    2024年02月07日
    浏览(48)
  • 【排序算法】排序算法介绍及插入排序 ( 直接插入排序 && 希尔排序 )

    ​ ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯 长路漫漫浩浩,万事皆有期待 排序 :所谓排序,就是将一串数据,按照某种规律,或者以某种特性或,将数据按照递增或者递减,将数据从 无序转变为有序

    2023年04月21日
    浏览(42)
  • 排序算法——希尔排序图文详解

    注1:本篇是基于对直接插入排序法的拓展,如果对直接插入法不了解,建议先看看 直接插入排序 注2:本篇统一采用升序排序 希尔排序法又称缩小增量法。 希尔排序其实是直接插入排序的改进。 其 基本思想是 : 先选定一个整数gap,把待排序文件中所有记录分成数组,所有

    2024年02月07日
    浏览(39)
  • 排序算法之【希尔排序】

      📙 作者简介:  清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。 📘 相关专栏: C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误还望各路大佬指正! ✨每一次努力

    2024年02月08日
    浏览(41)
  • 排序算法-插入/希尔排序

    直接插入排序是一种简单的插入排序法,其基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。 当插入第i(i=1) 个元素时,前面的 array[0],array[1],…,array[i-1] 已经排好序,此时用

    2024年02月05日
    浏览(44)
  • 排序算法:希尔排序

            1959 年 7 月,美国辛辛那提大学的数学系博士 Donald Shell 在 《ACM 通讯》上发表了希尔排序算法,成为首批将时间复杂度降到 O(n²)以下的算法之一。虽然原始的希尔排序最坏时间复杂度仍然是 O(n²) ,但经过优化的希尔排序可以达到 O(n^1.3)甚至O(n^7/6)。       

    2024年02月11日
    浏览(41)
  • 【排序算法】希尔排序

    希尔排序是一种经典的排序算法,它通过多次插入排序的方式,以及逐步缩小增量的策略,实现对数据的高效排序,希尔排序法又称缩小增量法。 希尔排序的核心思想在于将待排序的数据分成若干组,对每一组数据进行插入排序。这样做的好处是,一方面可以减少数据的比较

    2024年04月13日
    浏览(33)
  • (十三)排序算法-希尔排序

    1.1 概述 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种 插入排序 ,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序相比较与插入排序多加了一步就是确定步长。之前在插入排序的过程中,步长是固定的即

    2023年04月14日
    浏览(40)
  • 排序算法-----希尔排序

    目录 前言 希尔排序(shell) 排序原理 大致思路 示例  代码实现(C语言) 算法分析 时间复杂度 空间复杂度 稳定性         前面我有一篇插入排序的详细的文章讲解(链接:排序算法-----插入排序(图文详解)_灰勒塔德的博客-CSDN博客)今天我们接着学习排序算法中的希尔

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包