前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试高频题:归并排序详解

面试高频题:归并排序详解

作者头像
老九君
发布2022-08-29 14:10:48
3420
发布2022-08-29 14:10:48
举报
文章被收录于专栏:老九学堂老九学堂

对于经典算法,你是否也遇到这样的情形:学时觉得很清楚,可过阵子就忘了?这篇文章带你手写归并排序并记住它!

01 

【如何合并已经排好序的数组】

研读那些排序算法,细品它们的名字,其实都很贴切。比如归并排序,“归并”二字就是“递归”加“合并”。

——它是典型的分而治之算法。

上图中,先把数组一分为二,然后递归地排序好每部分,最后合并。

其中,分和归相对容易些,该算法的核心是:如何合并两个已经排好序的数组

解决办法很容易想到,两权相较取其轻。

如上图所示,每次比较取出一个相对小的元素放入结果数组中。

翻译成代码:

代码语言:javascript
复制
let left = [2, 4, 6], i = 0let right = [1, 3, 5], j = 0let result = []while(i < left.length && j < right.length) {  if (left[i] < right[j]) {    result.push(left[i])    i++  } else {    result.push(right[j])    j++  }}console.log(result) // [ 1, 2, 3, 4, 5 ]

代码中,i和j分别是两个数组的下标。遍历结束后,某个数组可能会有剩余,全部追加到结果数组中就可以了:

代码语言:javascript
复制
if (i < left.length) {  result.push(...left.slice(i))} if (j < right.length){  result.push(...right.slice(j))}

说明:

为了清晰表达二者谁都可能剩余,这里没有直接使用if...else。事实上不会出现二者都有剩余情况(while循环保证的)。

另外,这里使用了数组相关API(concat也可以),也可以直接使用循环来做。

02

【归并排序的分和归】

关于分,只要把数组从中间劈成两半就行了:

代码语言:javascript
复制
let m = Math.floor(array.length / 2)let left = array.slice(0, m)let right = array.slice(m)

至于递归,虽然它不符合线性思维,但其实也没有什么难的。只要有递归步骤(递归公式),就很容翻译成代码。

我们再回忆一下归并算法的步骤:

1、数组分成两半,left和right

2、递归处理left

3、递归处理right

4、合并二者结果

然后再来轻松翻译成代码:

代码语言:javascript
复制
function mergeSort(array) {  let m = Math.floor(array.length / 2)  let left = mergeSort(array.slice(0, m))  let right = mergeSort(array.slice(m))  return merge(left, right)}

递归是自身调用自身,不能无限次地调用下去,因此需要有递归出口(初始条件)

它的递归出口是,当数组元素个数为小于2时,就是已经是排好序的,不需要再递归调用了。

因此需要在前面加入代码:

代码语言:javascript
复制
if (array.length < 2) {  return array}

至此,归并排序原理和实现已经说完了,这里再来做一个总结。

  • 归并排序需要额外空间,空间复杂度为O(n),不是本地排序,相等元素是不会交换前后顺序,因而是稳定排序。时间复杂度为O(nlogn),是比较优秀的算法,在面试题中出现的概率也很高。
  • 归并排序是分而治之算法,都需要分、归、并,重头戏在于如何去并。
  • 归并排序,要做到能分分钟手写出来,是需要掌握其排序原理的。其关键在于,通过比较取小来合并两个已递归排好序的数组。至于递归,只要能说清楚递归步骤和出口,就能很容易写出来。

阅读原文

了解老九学堂暑期线下就业班详情

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老九学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档