【排序】归并排序,C++实现
原创文章,转载请注明出处!
# 基本思想(分治法)
归并排序中, “归”代表递归的意思,即递归的将数组通过折半的方式分离为单个数组。 “并”代表合并的意思,即将分开的数据按照从小到大或从大到小的顺序合并。运用分治法进行归并排序的过程如下:


# 合并过程
下图是将两个有序的子序列合并成一个有序序列的示意图。合并时需要建立一个临时数组,避免合并过程中频繁的开辟空间。

# C++代码
#include <iostream>
#define N 105
using namespace std;
int n;
int a[N], t[N]; /* 合 */
//下标从0开始
void Merge(int a[], int l, int m, int r)
{
// p指向临时数组
int p = 0;
// i指向第一个子表
int i = l;
// j指向第二个子表
int j = m + 1; /* 两个子表都不为空时 */
while(i <= m && j <= r)
{
/* 取关键字小的元素转移至临时数组 */
if (a[i] > a[j])
t[p++] = a[j++];
else
t[p++] = a[i++];
} /* 将非空的输入区间转移至输出区间 */
while(i <= m) t[p++] = a[i++];
while(j <= r) t[p++] = a[j++]; /* 归并完成后将结果复制到原输入数组 */
for (i = 0; i < p; i++)
a[l + i] = t[i];
} /* 分 */
void MergeSort(int a[], int l, int r)
{
/* 将长度为n的输入序列分成两个长度为n/2的子序列 */
if (l < r)
{
/* 中间元素*/
int m = (l + r) / 2; // 递归拆分
MergeSort(a, l, m);
MergeSort(a, m + 1, r); // 递归合并
Merge(a, l, m, r);
}
}
int main()
{
// 输入测试用例
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i]; // 归并排序
MergeSort(a, 0, n - 1); // 打印排序结果
for(int i = 0; i < n; i++) cout << a[i] << " "; return 0;
}
【排序】归并排序,C++实现的更多相关文章
- JS快速排序 希尔排序 归并排序 选择排序
/* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...
- 内部排序->归并排序->2-路归并排序
文字描述 假设初始序列有n个记录,则可看成是n个有序的字序列,每个字序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列:再两两归并,…, 如此重复,直到得到一个长度为n的有序序列为 ...
- python 排序 归并排序
算法思想 迭代法: 归并算法一共有两种思想,笼统的说,这两种思想的区别就在于一种不分割未排序的序列(直接将序列看为n个个数为1的子序列),这种称为---迭代法 直接从队头开始,两两合并为一个个数为2的 ...
- 排序 归并排序&逆序对
void MergeArray(int cry[],int temp[],int begin,int middle,int end) { int i=begin; int j=middle+1; in ...
- 高速排序,归并排序,堆排序python实现
高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...
- C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序
C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序 标签: 数据结构 数组 链表 高速排序 归并排序 抽象类 虚继承 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Hom ...
- 基于python的七种经典排序算法
参考书目:<大话数据结构> 一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. ...
- <Data Structure and Algorithm>排序算法
排序稳定:如果两个数相同,对他们进行的排序结果为他们的相对顺序不变.例如A={1,2,1,2,1}这里排序之后是A = {1,1,1,2,2} 稳定就是排序后第一个1就是排序前的第一个1,第二个1就是 ...
- 归并排序-java
排序-归并排序 基本思想:是指将两个或两个以上的有序表合并成一个新的有序表. 具体步骤: (1首先将整个表看成是n个有序子表,每个子表的长度为1. (2)然后两两归并,得到n/2个长度为2的有序子表. ...
- c#:排序
http://www.cnblogs.com/end/archive/2011/10/22/2220940.html 选择排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 基数排序 计数排序 小 ...
随机推荐
- Swift学习笔记 - URL编码encode与解码decode
使用swift有一段时间了,api的变换造成了很多困扰,下面是关于url编码和解码问题的解决方案 在Swift中URL编码 在Swift中URL编码用到的是String的方法 func addingP ...
- mysql完全卸载
转载自(http://blog.csdn.net/typa01_kk/article/details/49057073) #################CentOS7下MySQL的卸载###### ...
- Feign PathVariable annotation was empty on param 0.
使用Feign的时候,如果参数中带有 @PathVariable形式的参数,则要用value=""标明对应的参数,否则会抛出IllegalStateException异常 如 @P ...
- 【Semantic Segmentation】 Instance-sensitive Fully Convolutional Networks论文解析(转)
这篇文章比较简单,但还是不想写overview,转自: https://blog.csdn.net/zimenglan_sysu/article/details/52451098 另外,读这篇pape ...
- sscanf输入总结
2017-08-21 15:09:47 writer:pprp sscanf很好用的,一般配合gets()来使用 /* theme: usage of sscanf writer:pprp date: ...
- WPF圆角透明无边框窗体
<Window x:Class="ImportData.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- pg按日,周,月进行数据统计
pg数据库按周,月统计数据 SELECT date_trunc('WEEK', insert_time) as insertDate, SUM(data_increment) as dataTotal ...
- 你可能不知道的mouseover/mouseout mouseenter/mouseleave
mouseover与mouseenter 1. 触发时机 mouseover在被监听的节点与子节点上都会触发 mouseenter只在被监听的节点上触发 本质上是因为mouseenter不能冒泡 2. ...
- LabVIEW之生产者/消费者模式--队列操作
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- SPOJ MYQ10 (数位DP)
题意 询问区间[a,b]中的Mirror Number的个数,其中Mirror Number是指把它横着翻转后还能表示同样的数字. 思路 注意这个可不是回文数..除了0,1,8,别的数字翻转过后就不是 ...