算法学习->归并排序
nwpu-2020级算法实验1-problemB
Overview
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
有两种实现方式:
自上而下的递归
所有的递归都可以由迭代重写。
自下而上的迭代
算法步骤
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。
其实就是leetcode中我做过的暴力合并数组
直观演示


算法分析
动图展示了我们实现算法的过程,而这个分治图静态展示了递归的流程。
分:递归拆分子序列,递归深度易得logn
治:将有序子序列合并为更大的有序序列。
下面是治的最后一步的过程(熟练可略过):

算法实现
C递归
1 //归并排序递归
2 #include<stdio.h>
3 //#include<stdlib.h>
4 //#include<iostream>
5 using namespace std;
6 void merge_sort_recursive(int arr[], int reg[], int start, int end) {
7 if (start >= end)
8 return;
9 //停止递归的条件,即只有单个元素时必定有序
10 int len = end - start, mid = (len >> 1) + start;
11 int start1 = start, end1 = mid;//第一个数组
12 int start2 = mid + 1, end2 = end;//第二个数组
13 merge_sort_recursive(arr, reg, start1, end1);
14 merge_sort_recursive(arr, reg, start2, end2);
15 //将数组拆分,直到上面的if生效(即每个子序列只有单个元素),此时停止递归,开始回溯
16 int k = start;
17 while (start1 <= end1 && start2 <= end2)
18 reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
19 //这种写法更为简洁,实现的就是谁小谁放进去
20 while (start1 <= end1)
21 reg[k++] = arr[start1++];
22 while (start2 <= end2)
23 reg[k++] = arr[start2++];
24 //多余元素直接放入reg
25 for (k = start; k <= end; k++)
26 arr[k] = reg[k];
27 //一次返回赋值,即把reg里排好序的元素粘回arr
28 }
29
30 void merge_sort(int arr[], const int len) {
31 int reg[len];//构造算法步骤中所说的新的数组
32 merge_sort_recursive(arr, reg, 0, len - 1);
33 //启动递归
34 //输出
35 for(int i = 0; i < len; i++){
36 printf("%d\n", arr[i]);
37 }
38 //此处还可以clear *reg来保证代码安全。
39 }
40 int main(){
41 int n;
42 scanf("%d", &n);
43 int Array[n];
44 for(int i = 0; i < n; i++){
45 scanf("%d", &Array[i]);
46 }
47 merge_sort(Array, n);
48 return 0;
49 }
参考文章:
算法学习->归并排序的更多相关文章
- Java常见排序算法之归并排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 啃算法:归并排序及JavaScript实现
在学习归并排序之前,有必要了解分治法,因为归并排序正是应用了分治模式.(基本定义摘自<算法导论>) 一.分治法 1.思想: 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些 ...
- DSP算法学习-过采样技术
DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...
- 算法学习之C语言基础
算法学习,先熟悉一下C语言哈!!! #include <conio.h> #include<stdio.h> int main(){ printf(+); getch(); ; ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- C / C++算法学习笔记(8)-SHELL排序
原始地址:C / C++算法学习笔记(8)-SHELL排序 基本思想 先取一个小于n的整数d1作为第一个增量(gap),把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组 ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 二次剩余Cipolla算法学习笔记
对于同余式 \[x^2 \equiv n \pmod p\] 若对于给定的\(n, P\),存在\(x\)满足上面的式子,则乘\(n\)在模\(p\)意义下是二次剩余,否则为非二次剩余 我们需要计算的 ...
- Manacher算法学习笔记 | LeetCode#5
Manacher算法学习笔记 DECLARATION 引用来源:https://www.cnblogs.com/grandyang/p/4475985.html CONTENT 用途:寻找一个字符串的 ...
随机推荐
- C++进阶—>带你理解多字节编码与Unicode码
参考网址:https://blog.csdn.net/u011028345/article/details/78516320 多字节字符与宽字节字符 char与wchar_t 我们知道C++基本数据类 ...
- vue:Missing space before value for key 'components'
原因是Vue对语法比较严格,而eslint是一个语法检查工具,对语法要求极其苛刻严格,于是就error了 解决办法是关闭eslint的语法规则,找到build/webpack.base.conf.js ...
- C#基础知识---?为何物
一. 可空类型修饰符(?)引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.可空类型的出现, ...
- ANSI C说明了三个用于存储空间动态分配的函数
1.1 malloc的全称是memory allocation,中文叫动态内存分配.原型:extern void *malloc(unsigned int num_bytes);说明:分配长度为num ...
- 【C#】GC和析构函数(Finalize 方法)
析构函数: (来自百度百科)析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数.析构函数往往用来做"清理善后&quo ...
- C#的生产者和消费者 实例
class Program { //写线程将数据写入myData static int myData = 100; //读写次数 const int readWriteCount = 20; //fa ...
- jQuery中ajax请求的六种方法(三、一):$.ajax()方法
1.基础的$.ajax()方法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- ubuntu软件工具推荐
时间:2019-04-11 记录:PangYuaner 标题:串口调试利器--Minicom配置及使用详解 地址:https://www.cnblogs.com/wonux/p/5897127.htm ...
- centos7 ftp 拒绝连接
2021-09-03 1. 问题描述 刚才在重新搭建 ftp 服务器时,发现 ftp 拒绝连接,想起来我还没启动 vsftpd 服务,尝试启动却无法启动 vsftpd 服务 2. 解决方法 使用命令 ...
- 搭建本地yum源出现:mount: 在 /dev/sr0 上找不到媒体
2021-07-27 在练习环境搭建时,因为是离线环境,故先搭建本地yum源,但是出现了一个往常没有的问题:mount: 在 /dev/sr0 上找不到媒体,参考其他博主的文章得到解决方法. 排查问题 ...