希尔排序算法实例讲解_十大算法排名

希尔排序算法实例讲解_十大算法排名一、什么是希尔排序1.概念希尔排序(ShellSort)是把记录按下标的一定增量分组,对每组使用插入排序算法,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止2.算法原理这是一个无序数列:1、5、8、4、7、2、6、3,我们要将它按从小到大排序。按照希尔排序的思想,我们先把数列进行分组排序首先,我们选择序列长度的一半4,作为增量进行分组如果所示,1和7一组,5和2一组,8和6一组,4和3一组,共四组然后,我们对每一组进行插入排序,排序后序列如下经

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

十大经典排序算法

一、什么是希尔排序

1.概念

希尔排序(Shell Sort)是把记录按下标的一定增量分组,对每组使用插入排序算法,随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分为一组,算法终止

2.算法原理

这是一个无序数列:1、5、8、4、7、2、6、3,我们要将它按从小到大排序。按照希尔排序的思想,我们先把数列进行分组排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3mJDYTFM-1591770808598)(./希尔1.png)]
首先,我们选择序列长度的一半4,作为增量进行分组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSodnhEj-1591770808600)(./希尔2.png)]
如果所示,1和7一组,5和2一组,8和6一组,4和3一组,共四组

然后,我们对每一组进行插入排序,排序后序列如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1U9xjSX-1591770808601)(./希尔3.png)]
经过这一轮排序,序列有序了很多,接着我们进一步缩小增量,增量缩小为原来的一半,也就是2,再进行分组排序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0AXx9M0-1591770808602)(./希尔4.png)]
如图所示,1、6、7、8一组,2、3、5、4一组,共两组

我们再对每一组进行插入排序,排序后序列如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dVZQ7HZY-1591770808604)(./希尔5.png)]
最后,我们进一步把增量缩小为原来一半,也就是1,这相当于直接在序列上进行插入排序,排序结果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0x3LrwTY-1591770808607)(./希尔6.png)]
至此所有的元素都是有序的

3.算法实现

function sort(arr) {
    // 希尔排序的增量
    let d = arr.length;
    while (d > 1) {
        // 使用希尔增量的方式,每次折半
        d = parseInt(d / 2);
        for (let x = 0; x < d; x++) {
            for (let i = x + d; i < arr.length; i = i + d) {
                let temp = arr[i];
                let j;
                for (j = i - d; j >= 0 && arr[j] > temp; j = j - d) {
                    arr[j + d] = arr[j];
                }
                arr[j + d] = temp;
            }
        }
    }
}

let arr = [1, 5, 8, 4, 7, 2, 6, 3];
sort(arr);
console.log(arr);

Jetbrains全家桶1年46,售后保障稳定

二、希尔排序算法特点

1.时间复杂度

希尔排序算法利用分组粗调的方式减少了插入排序算法的工作量,使得算法的平均复杂度低于O(N^2)

但某些极端的情况下,希尔排序算法的时间复杂度仍然是O(N^2),甚至比插入排序算法更慢
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EO2azRMG-1591770808608)(./希尔7.png)]
上图是我们刚刚希尔排序例子里,进行最后一次增量为1时排序前的序列,如果初始序列就是这个,那么前面进行的增量为4、增量为2的排序,都没有产生任何元素的交换,反而增加了分组操作的成本

为了降低希尔排序算法的时间复杂度,提出了更严谨的算法增量

  • Hibbard增量,序列为:1、3、7、15…,通项公式为2^k-1, 最坏的时间复杂度为O(n^(3/2))
  • Sedgewick增量,序列为:1、5、19、41、109…,通项公式为 9 * 4^k – 9 * 2^k + 1 或者 4^k – 3 * 2^k + 1,最坏的时间复杂度为O(n^(4/3))

2.空间复杂度

希尔排序算法排序过程中需要一个临时变量存储插入元素,所需要的额外空间为1,因此空间复杂度为O(1)

3.稳定性

希尔排序算法会进行分组排序,在分组排序的过程中有可能改变相同元素的前后位置,因此是一种不稳定的排序算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zjhs2mU-1591770808610)(./希尔8.png)]
上图例子中,绿色5在紫色5之前,但经过希尔排序之后,绿色5在紫色5之后,所以希尔排序是一种不稳定排序算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215565.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javascript onpropertychange

    javascript onpropertychangeNewDocument functioninit() { all_real(); } functionall_real() { varbasePay=document.all("hrSalary.basePay").value; vartextf…

    2022年7月13日
    11
  • tplink匿名设备_HTML代码在实体化编码后是什么

    tplink匿名设备_HTML代码在实体化编码后是什么前言:论文:https://arxiv.org/pdf/2010.13415.pdf代码:https://github.com/131250208/TPlinker-joint-extraction这篇论文是最新的基于joint方式进行的联合抽取实体关系的模型。主要创新点是提出了新的标注数据方法,具体可以看论文,本篇的主要目的是解读代码逻辑,更多想法细节可以先看论文。主要算法流程就是:总结来说就是:4-8先进行实体抽取得到字典D(key是实体头部,value是实体尾部)

    2025年6月1日
    1
  • Delphi语言_DELPHI

    Delphi语言_DELPHI总结一下SQL语句中引号(‘)、quotedstr()、(”)、format()在SQL语句中的用法以及SQL语句中日期格式的表示(#)、(”)在Delphi中进行字符变量连接相加时单引号用(”’),又引号用(””)表示首先定义变量var AnInt:integer=123;//为了方便在此都给它们赋初值。虽然可能在引赋初值在某些情况下不对AnIntStr:str

    2022年10月18日
    0
  • SpringMvc工作原理学习总结

    SpringMvc工作原理学习总结SpringMvc工作原理了解SpringMvc之前先看看Mvc的工作原理1、MVC工作原理M:Model(完成业务逻辑Service/dao/entity/)V:View(完成界面渲染jsp/html)C:Controller(控制器->类似于CPU接受请求->调用M->返回V)MVC工作原理图2、SpringMvc工作原理Spring和SpringMvc的关系:SpringMVC是一个MVC的开源框架,SpringMVC是Spring的一个

    2022年5月15日
    45
  • ncurses编程文档_nupack软件

    ncurses编程文档_nupack软件Frm:http://blog.csdn.net/Mary_Jane/article/details/50769631介绍ncurses(newcurses)是一套编程库,它提供了一系列的函数

    2022年8月4日
    2
  • 数据采集与清洗基础习题(三)Python正则表达式,头歌参考答案

    数据采集与清洗基础习题(三)Python正则表达式,头歌参考答案数据采集习题参考答案,会持续更新,点个关注防丢失。创作不易,一键三连给博主一个支持呗。目录实训八:Python正则表达式断言第一关:先行断言第一关答案第二关:后发断言第二关答案实训九:python正则表达式标记实训九答案实训八:Python正则表达式断言第一关:先行断言编程要求请根据相关知识补充右侧Begin-End之间的代码,并完成下列任务:使用正向先行断言获取字符串中以ing结尾的字符(不能为空)。相关知识先行断言分为正向先行断.

    2022年10月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号