文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

说下希尔排序的过程? 希尔排序的时间复杂度和空间复杂度又是多少?

2024-12-02 19:12

关注

1959年Shell发明,第一个突破 O(n^2^) 的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。

插入排序

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

代码实现:

  1. function insertionSort(arr) { 
  2.     let n = arr.length; 
  3.     let preIndex, current
  4.     for (let i = 1; i < n; i++) { 
  5.         preIndex = i - 1; 
  6.         current = arr[i]; 
  7.         while (preIndex >= 0 && arr[preIndex] > current) { 
  8.             arr[preIndex + 1] = arr[preIndex]; 
  9.             preIndex--; 
  10.         } 
  11.         arr[preIndex + 1] = current
  12.     } 
  13.     return arr; 

插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

复杂度分析:

希尔排序

回顾一下上面的插入排序:

所以,如果序列足够乱的话,时间复杂度为 O(n^2^)

希尔排序又是如何优化的喃?

希尔排序又叫缩小增量排序,就是把数列进行分组(组内不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。

其中组的数量称为 增量 ,显然的是,增量是不断递减的(直到增量为1)

那我们有是如何进行分组喃?

往往的: 如果一个数列有 8 个元素,我们第一趟的增量是 4 ,第二趟的增量是 2 ,第三趟的增量是 1 。如果一个数列有 18 个元素,我们第一趟的增量是 9 ,第二趟的增量是 4 ,第三趟的增量是2 ,第四趟的增量是 1

很明显我们可以用一个序列来表示增量:n/2、(n/2)/2、...、1,每次增量都/2

例如:

  1. let arr = [4, 1, 5, 8, 7, 3] 

排序前:

将该数组看成三组( Math.floor(arr.length/2) ),分别是:[4, 1] , [5, 8] , [7, 3]

第一趟排序:

对三组数据分别进行插入排序,因此我们三个数组得到的结果为:[1, 4] , [5, 8] , [3, 7]

此时数组是这样子的:[1, 4, 5, 8, 3, 7]

第二趟排序:

代码实现:

  1. function shellSort(arr) { 
  2.     let n = arr.length; 
  3.     for (let gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap / 2)) { 
  4.         for (let i = gap; i < n; i++) { 
  5.             let j = i; 
  6.             let current = arr[i]; 
  7.             while (j - gap >= 0 && current < arr[j - gap]) { 
  8.                  arr[j] = arr[j - gap]; 
  9.                  j = j - gap; 
  10.             } 
  11.             arr[j] = current
  12.         } 
  13.     } 
  14.     return arr; 

复杂度分析:

 

 

来源: 三分钟学前端内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯