算法学习->归并排序
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 用途:寻找一个字符串的 ...
随机推荐
- 【springcloud】springcloud与springboot的版本对应关系
官方网址:https://start.spring.io/actuator/info 更新时间:2019-12-01 spring-cloud: "Finchley.M2": &q ...
- CentOS7部署SSH服务
1 ssh服务部署 输入命令 yum list | grep ssh 查看可安装的软件包,选择openssh-service.x86_64 输入下面命令进行安装openssh服务 yum instal ...
- T-SQL - query02_查看数据库信息|查看服务器名称|查看实例名
时间:2017-09-29 编辑:byzqy 本篇记录几个查询数据库信息的 T-SQL 语句: 查看数据库信息 查看服务器名称 查看实例名 文件:SQLQuery2.sql /* 说明: SQLQue ...
- Ubuntu下安装Python3(与旧Python2版本共存)
官网下载Python3的源码 进行配置,在源码目录运行如下命令. ./configure --prefix=/usr/local/python3 --enable-shared 进行编译,在源码目录运 ...
- 从零开始实现简单 RPC 框架 6:网络通信之 Netty
网络通信的开发,就涉及到一些开发框架:Java NIO.Netty.Mina 等等. 理论上来说,类似于序列化器,可以为其定义一套统一的接口,让不同类型的框架实现,事实上,Dubbo 就是这么干的. ...
- DNSPod DDNS 动态域名设置
所谓动态域名,就是当你的服务器 IP 地址发生变化的时候,自动地修改你在「域名解析服务商」那里的域名记录值 怎么操作?看官方文档 DNSPod用户API文档 首先需要创建 Token 完整的 API ...
- 简单三分钟,本地搭建 k8s
使用 minikube 在本地搭建 k8s 已经比以前要简单很多了.本文,我们通过简短的三分钟来重现一下在本地搭建 k8s 实验环境的步骤. Newbe.Claptrap 是一个用于轻松应对并发问题的 ...
- Dockerfile简介及基于centos7的jdk镜像制作
Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...
- MySQL——InnoDB事务
事务:全部成功 或 全部失败! ------------------------------------------------------------------------------------ ...
- NOIP模拟14「队长快跑·影魔·抛硬币」
T1:队长快跑 基本思路: 离散化·DP·数据结构优化DP 这三个我都没想到....气死. 定义状态数组:\(c[i][j]\)表示在i时最小的a值是j时可以摧毁的最多的水晶数. 那么 ...