带你读《图解算法小抄》十四、排序(7)

简介: 带你读《图解算法小抄》十四、排序(7)

带你读《图解算法小抄》十四、排序(6)https://developer.aliyun.com/article/1348144?groupCode=tech_library


1原理

归并排序的基本思想是将待排序的序列不断划分为两个子序列,直到每个子序列只剩下一个元素,然后再将这些子序列两两合并,直到最终得到有序的序列。具体的排序流程如下:

 

  • 步骤1:将待排序序列分成两个子序列,分别进行递归排序;
  • 步骤2:将两个已排序的子序列合并成一个有序序列。

 

function mergeSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  const mid = Math.floor(arr.length / 2);
  const left = mergeSort(arr.slice(0, mid)); // 递归排序左半部分
  const right = mergeSort(arr.slice(mid)); // 递归排序右半部分
  return merge(left, right); // 合并左右两个有序子序列}
function merge(left, right) {
  let i = 0; // 左半部分指针
  let j = 0; // 右半部分指针
  const merged = [];
  while (i < left.length && j < right.length) {
    if (left[i] < right[j]) {
      merged.push(left[i]); // 将较小值放入合并数组
      i++;
    } else {
      merged.push(right[j]); // 将较小值放入合并数组
      j++;
    }
  }
  // 将剩余的元素放入合并数组
  return merged.concat(left.slice(i)).concat(right.slice(j));
}

2优化手段:

尽管归并排序已经是一种高效的排序算法,但我们可以通过一些优化手段进一步提高其性能。下面介绍几种常见的优化策略:

插入排序优化:

对于小规模的子序列,插入排序的时间复杂度较低,因此可以在归并排序的过程中使用插入排序来提高性能。具体做法是,在划分到一定规模后,将子序列采用插入排序算法进行排序。

优化合并过程:

在合并两个有序子序列时,如果发现左边子序列的最大元素小于等于右边子序列的最小元素,那么说明整个序列已经有序,可以直接跳过合并操作,节省时间。


带你读《图解算法小抄》十四、排序(8)https://developer.aliyun.com/article/1348142?groupCode=tech_library

 

相关文章
|
11天前
|
算法 C++
【洛谷 P1223】排队接水(贪心算法+结构体排序)
该问题要求安排$n$个人的排队顺序以最小化平均等待时间。每个人接水需时$T_i$,解决方案是让接水时间短的人优先。给定$n\leq1000$和$t_i\leq10^6$,代码示例使用C++实现,通过排序使时间从小到大排列,然后计算平均等待时间。样例输入为10个人的时间数组,输出为优化后的排队顺序及平均等待时间(291.90)。
12 0
|
14天前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
|
18天前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
5天前
|
算法 Java 调度
Java数据结构与算法:拓扑排序
Java数据结构与算法:拓扑排序
|
5天前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
14 0
|
10天前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。
|
11天前
|
人工智能 算法 BI
【洛谷 P1803】凌乱的yyy _ 线段覆盖 题解(贪心算法+结构体排序)
**线段覆盖问题**: YYY 想在 NOIP 前参加最多比赛。给定 $n$ 场比赛的开始和结束时间,每场比赛必须连续且不能冲突。输入包含每场比赛的时间段,输出最多可参加的比赛数。$20\%$ 数据 $n\leq10$,$50\%$ 数据 $n\leq10^3$,$100\%$ 数据 $n\leq10^6$。解决方案:按结束时间排序比赛,若当前比赛开始时间晚于上一个结束时间,则计数加一。样例输入:3 场比赛,输出:2。AC C++ 代码实现了此算法。
11 0
|
18天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
21天前
|
算法 搜索推荐 数据可视化
【漫画算法】指挥官的排序战术:快速排序算法解密
【漫画算法】指挥官的排序战术:快速排序算法解密
|
21天前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】