基础算法(二)——归并排序

news/2024/10/21 18:37:23/

归并排序

介绍

归并排序是一种复杂度O(nlog(n)nlog(n)nlog(n))的排序算法,并且在任何情况下都是,但是它不是原地算法,即需要额外存储空间

其原理是,先将区间均匀分成左右两半,然后再对左右两半继续二分,直到一个数为一个区间为止。

然后从小区间到大区间进行左右区间合并。合并方式就是将两个有序间合并为一个大区间,并且大区间保持有序,因为最小区间单元是一个数,因此最初的区间一定有序,由下至上就可以保证合并过程中的区间都是有序的

因此可以发现,归并排序的核心是先递归后排序

核心思想:

合并过程步骤:

  • 开辟一个新的内存空间tmp用于存放合并后的区间
  • 设定两个指针分别指向待合并的两个区间起点
  • 比较两个指针的数,取较小值放入tmp
  • 最后将未指向终点的指针所代表那个区间接到tmp区间的后面
  • tmp区间的内容覆盖回原区间

将两个小区间通过双指针算法,合并为一个大区间,最后把大区间的内容覆盖回原来两个小区间

模板代码:

int q[N], tmp[N];void merge_sort(int q[N], int l, int r)
{if( l >= r) return;int mid = l + r >> 1;merge_sort(q, l, mid), merge_sort(q, mid + 1, r);int i = l, j = mid + 1, k = 0; // i 和 j 分别是左右区间的第一个下标// 区间合并while( i <= mid && j <= r ){if( q[i] < q[j] )  tmp[k++] = q[i++];else tmp[k++] = q[j++];}// 将剩余的区间补上while(i <= mid) tmp[k++] = q[i++];while(j <= r) tmp[k++] = q[j++];// 将排序好的内容重新放回q数组for(int i=l, k=0; i<=r; i++, k++) q[i] = tmp[k];
}

例题

image-20230107221616855

思路:

按上述模板进行书写即可

代码:

#include<iostream>
using namespace std;const int N = 1e6 + 10;int n;
int q[N];void quick_sort(int q[N], int l, int r)
{if(l >= r) return;int i = l - 1, j = r + 1, x = q[l + r >> 1];while(i < j){do i++;while(q[i] < x);do j--;while(q[j] > x);if( i < j ) swap(q[i], q[j]);}quick_sort(q, l, j), quick_sort(q, j+1, r);
}int main()
{scanf("%d", &n);for(int i=0; i<n; i++) scanf("%d", &q[i]);quick_sort(q, 0, n-1);1. List itemfor(int i=0; i<n; i++) printf("%d ", q[i]);
}

http://www.ppmy.cn/news/10290.html

相关文章

LeetCode 138. 复制带随机指针的链表(C++)

思路&#xff1a; 用哈希表实现&#xff0c;创建一个哈希表来对应原链表中的每一个节点&#xff0c;这样也可以将原链表中的所有结点的next和random关系映射到哈希表复制链表中。 原题链接&#xff1a;https://leetcode.cn/problems/copy-list-with-random-pointer/description…

2023年1月7日:fastadmin导出数据为excel格式

需求图&#xff1a; 实现方法&#xff1a; 第一种方法&#xff1a;fastadmin自带导出数据&#xff0c;直接点击下载即可 效果图第二种方法&#xff1a;自定义导出按钮&#xff0c;需要编写方法 效果图&#xff1a; 效果图代码实现 首先&#xff1a;前端按钮代码(可直接拿来用…

Apifox调用Security权限接口

Apifox调用Security权限接口1. SpringBoot3.0集成SpringSecurity1.1 pom1.2 properties配置2. Apifox 配置2.1 配置根目录Auth2.2 ApiFox 分享调用本地接口本教程环境&#xff1a; Apifox&#xff1a;2.2.14 &#xff08;建议更新到最新版本&#xff0c;老版本Auth从父级继承可…

2023春招面试专题:高并发解决方案

如何理解高并发&#xff1f; 高并发意味着大流量&#xff0c;需要运用技术手段抵抗流量的冲击&#xff0c;这些手段好比操作流量&#xff0c;能让流量更平稳地被系统所处理&#xff0c;带给用户更好的体验。 我们常见的高并发场景有&#xff1a;淘宝的双11、春运时的抢票、微…

组合数素数判定++和* *t=*afor循环你真的门儿清吗救济金发放

目录 P63_习题4-1_组合数 为什么m n-m P64_习题4-3_素数判定 为什么要floor 到底为什么判断到sqrt(n)即可 和* *t*a for循环你真的门儿清吗 为什么要把较大的数组放在main函数外 P82_eg4-3_救济金发放_UVa133 P63_习题4-1_组合数 防止溢出&#xff0c;又因为m < n…

leetcode 1658. 将 x 减到 0 的最小操作数

给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返回 最小操作数 &#x…

字节跳动青训营笔试题解

文章目录前言一、单选题二、多选题三、编程题T1.旋转数组最大值题目思路代码T2.社交圈题目思路代码四、简答题题目思路前言 第五届字节跳动青训营-后端专场笔试题解&#xff0c;简单做了一下&#xff0c;选择题和简答题不知道是否正确&#xff0c;编程题是通过了的&#xff0c…

【vue2】计算属性(computed)与侦听器(watch)详解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;计算属性与侦听属性的用法 目录&#xff08;文末有给大家准备好的Xmind思维导图&#xf…