分治法——归并排序(mergesort)
首先上代码。
#include <iostream>
using namespace std; int arr[11];
/*两个序列合并成一个序列。一共三个序列,所以用 3 根指针来处理。
i 是 low 到 mid 这个序列下标 序列 1
j 是 mid+1 到 high 这个序列下标 序列 2
k 代表新序列的下表 序列 3
*/
void merge(int a[], int low, int mid, int high)
{
int i = low, j = mid+1, k =low;
int b[11];//这里直接开大一点。省事 /*把序列 1 和序列 2 里面小的元素先放进序列 3 */
while(i <= mid && j <= high)
if(a[i] <= a[j]) b[k++] = a[i++];
else b[k++] = a[j++]; /*如果序列 2 的元素先消耗完,那就把序列 1 里面的所有元素放进序列 3*/
while(i <= mid)
b[k++] = a[i++];
/*如果序列 1 的元素先消耗完,那就把序列 2 里面的所有元素放进序列 3*/
while(j <= high)
b[k++] = a[j++];
/*把序列 3 赋值给原来的序列*/
for(int i = low; i <= high; i++)
a[i] = b[i]; } void mergesort(int a[], int low, int high)
{
int mid;
if(low < high)
{
mid = (low + high)/2;
mergesort(a,low,mid);//递归划分序列
mergesort(a,mid+1,high);
merge(a,low,mid,high);
}
} int main()
{ for(int i = 1; i <= 10; i++)
scanf("%d",&arr[i]);
mergesort(arr,1,10);
for(int i = 1; i <= 10; i++)
cout<<arr[i]<<" ";
cout<<"\n";
return 0;
}
分治法一般分为三个步骤。1.分 2.治 3.合并。归并排序也是分治的思想,所以它也可以分为三步。
1.分。将大序列划为两个小序列(当然也可以多个)。一直划分到序列只有 1 个元素的时候停止。
2.治。因为停止时候序列元素只有 1 个,所以治这一步是没有体现出来的。
3.合并。这是归并排序的主要步骤。合并是将两个序列合并为一个有序序列。具体怎么合并,可以参考merge函数注释。
分治法——归并排序(mergesort)的更多相关文章
- 排序算法THREE:归并排序MergeSort
/** *归并排序思路:分治法思想 O(nlogn) * 把数组一分为二,二分为四 * 四和为二,二和为一 * */ /** * 归并排序主方法 *@params 待排序的数组 *@params 初始 ...
- 【LeetCode】分治法 divide and conquer (共17题)
链接:https://leetcode.com/tag/divide-and-conquer/ [4]Median of Two Sorted Arrays [23]Merge k Sorted Li ...
- 分治法(一)(zt)
这篇文章将讨论: 1) 分治策略的思想和理论 2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性. 说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它 ...
- 分治法求一个N个元素数组的逆序数
背景 逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...
- (逆序对 分治法)P1908 逆序对 洛谷
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- 分治法——快速排序(quicksort)
先上代码 #include <iostream> using namespace std; int partition(int a[],int low, int high) { int p ...
- python 实现分治法的几个例子
分治法所能解决的问题一般具有以下几个特征: 1) 该问题的规模缩小到一定的程度就可以容易地解决 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质. 3) 利用该问题分解出的子 ...
- 分治法及其python实现例子
在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...
- 算法笔记_065:分治法求逆序对(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序) 1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...
随机推荐
- msm audio machine 代码跟踪
sound/soc/msm/msm8952.c // 注册平台设备 static int __init msm8952_machine_init(void) { return platform_dri ...
- java 中 热部署与卸载关系
今天发现早年在大象笔记中写的一篇笔记,之前放在ijavaboy上的,现在它已经访问不了了.前几天又有同事在讨论这个问题.这里拿来分享一下. 在web应用开发或者游戏服务器开发的过程中,我们时时刻刻都在 ...
- 简单的 FastDFS + Nginx 应用实例
版权声明:本文为GitChat作者的原创文章,未经 GitChat 同意不得转载. https://blog.csdn.net/GitChat/article/details/79479148 wx_ ...
- flume学习笔记——安装和使用
Flume是一个分布式.可靠.和高可用的海量日志聚合的系统,支持在系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力. Flume是一 ...
- AT&T汇编指令
GAS中每个操作都是有一个字符的后缀,表明操作数的大小. C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4 f ...
- CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)
我在QT图形场景视图中通过QGraphicsProxyWidget添加代理Widget(实现添加基本的QT Widget,如按钮.复选框.日期时间控件等),当数量超过3500左右的时候,QT应用程序直 ...
- [原] MyBatis 整理
花了一上午的时间,先整理一个脑图.
- linux操作2
第2天 linux操作系统的目录结构 bin #可执行程序的安装目录,命令boot #系统启动引导目录dev #设备目录,deviceetc #软件配置文件目录home #用户的家目录lib #系 ...
- postgresql数据库和mysql数据库的对比分析
1.Posgresql是进程模式,多进程,单线程,类似的还有Oracle.而MYSQL采用的是线程模式,单进程,多线程,对此,大家在运行数据库的时候可以查看任务管理器,SQL Server也是如此. ...
- python——shopping car
# _Author:huang# date: 2017/11/26 # 简单的购物车程序money = input("money:") product_list = [ (&quo ...