归并排序(MergeSort)
原帖:http://blog.csdn.net/magicharvey/article/details/10192933
算法描述
归并排序(MergeSort)是采用分治法的一个非常典型的应用。通过先递归的分解数组,再合并数组就完成了归并排序。
基本思想
归并排序是将整个集合问题分解成最小单元,将该单元内的元素全部排序,然后将相邻的单元重新排序。如果将n1,n2看做一个整体n的话,则针对n,先对其一半进行排序,另一半排序,然后整体再次排序。
实现步骤
- 递归的将数组分为两个子数组,每个子数组重新分为两个子数组,直到数组个数为1为止;
- 将相邻的两个有序数组合并为一个有序数组;
- 最终直到剩下两个有序子数组,将其合并为一个总的有序大数组。
算法实现
//新建一个临时数组,用来存放排序好的元素
int temp[] = {}; //交换两个值的函数
void swap(int a, int b)
{
int index = a;
a = b;
b = index;
} //将两个有序的序列a[begin ... mid]和a[mid+1...end]合并
void M_Sort(int a[], int begin, int mid, int end)
{
int i = begin; //左边数组的开始节点
int j = mid+; //右边数组的开始节点
int k = ; //合并后的数组的下标 //左边或者右边数组是否有一个读取完毕
while(i <= mid && j <= end)
{
if( a[i] <= a[j])
{
temp[k++] = a[i++];
}
else
{
temp[k++] = a[j++];
}
} //将左边或者右边节点剩余的节点复制给临时数组
while(i <= mid)
{
temp[k++] = a[i++];
}
while(j <= end)
{
temp[k++] = a[j++];
} //k代表合并后的数组的大小
for(int m = ; m < k; m++)
{
a[begin+m] = temp[m]; //begin+m代表在a数组中的位置
}
} //将序列a[begin ... end]不断地分为相同的两个子序列,直到序列中的元素个数为1为止,不断递归
void MergeSort(int a[], int begin, int end)
{
if(begin<end)
{
int mid = (begin + end )/ ;
MergeSort(a, begin, mid); //递归左边的序列
MergeSort(a, mid+, end); //递归右边的序列
M_Sort(a, begin, mid ,end); //合并左右的序列
}
}
性能分析
归并算法是又分割和归并两部分组成的。对于分割部分,如果我们使用二分查找的话,时间是O(logn),在最后归并的时候,时间是O(n),所以总的时间O(nlogn)。
归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间,这在某些内存紧张的机器上会受到限制。
归并排序(MergeSort)的更多相关文章
- 归并排序 MergeSort
今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来. 学习链接:排序七 归并排序.图解排序算法(四)之归并排序 merge函数:将两个有序序列 ...
- 排序算法THREE:归并排序MergeSort
/** *归并排序思路:分治法思想 O(nlogn) * 把数组一分为二,二分为四 * 四和为二,二和为一 * */ /** * 归并排序主方法 *@params 待排序的数组 *@params 初始 ...
- 普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort
起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...
- 分治法——归并排序(mergesort)
首先上代码. #include <iostream> using namespace std; int arr[11]; /*两个序列合并成一个序列.一共三个序列,所以用 3 根指针来处理 ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- 《算法导论》归并排序----merge-sort
伪代码请见<算法导论>2.3节 merge-sort实现: public class MergeSort { public static void sort(double [ ...
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-006归并排序(Mergesort)
一. 1.特点 (1)merge-sort : to sort an array, divide it into two halves, sort the two halves (recursivel ...
- C#数据结构与算法系列(二十三):归并排序算法(MergeSort)
1.介绍 归并排序(MergeSort)是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解, 而治(conquer)的阶段则将分的阶段得 ...
- 排序算法——QuickSort、MergeSort、HeapSort(C++实现)
快速排序QuickSort template <class Item> void quickSort (Item a[], int l, int r) { if (r<=l) ret ...
- POJ2299 Ultra-QuickSort(归并排序求逆序数)
归并排序求逆序数 Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
随机推荐
- ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项
ACE是一个跨平台的用于并发通信的C++框架,项目开始时使用的是ACE 5.6发布版,目前最新的ACE版本是6.3.0. 网上一直有一种黑ACE的氛围,主要黑点在于ACE的复杂和作者的背景,结合实际应 ...
- Difference between List View and DataGrid in WPF
Well, in WPF the difference between ListView and DataGrid is just one. Editing. You need editing use ...
- [技巧篇]01.Servlet的优化模版代码
Servlet.java的模版 #---------------------------------------------# # <aw:description>Template for ...
- js:鼠标移动到文字显示div,移出文字div显示,鼠标能移进div
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- Hibernate入门(3)- 持久对象的生命周期介绍
在hibernate中对象有三种状态:瞬时态(Transient). 持久态(Persistent).脱管态或游离态(Detached).处于持久态的对象也称为PO(Persistence Objec ...
- python实现备份gitlab版本库并更改文件名
脚本的功能是实现备份gitlab版本库,并修改备份后的文件名,成功后发送邮件至相关负责人,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...
- sudo: /usr/libexec/sudo/sudoers.so must be only be writable by owne
1. chmod 644 sudoers.so 2. pkexec chmod 0440 /etc/sudoers
- 【LA】5135 Mining Your Own Business
[算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...
- 无缝衔接demo
如题. <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" con ...
- vmware安装ubuntu " Intel VT-x 处于禁用状态"
vmware安装ubuntu " Intel VT-x 处于禁用状态" http://jingyan.baidu.com/article/fc07f98976710e12ffe51 ...