原帖:http://blog.csdn.net/magicharvey/article/details/10192933

算法描述

归并排序(MergeSort)是采用分治法的一个非常典型的应用。通过先递归的分解数组,再合并数组就完成了归并排序。

基本思想

归并排序是将整个集合问题分解成最小单元,将该单元内的元素全部排序,然后将相邻的单元重新排序。如果将n1,n2看做一个整体n的话,则针对n,先对其一半进行排序,另一半排序,然后整体再次排序。

实现步骤

  1. 递归的将数组分为两个子数组,每个子数组重新分为两个子数组,直到数组个数为1为止;
  2. 将相邻的两个有序数组合并为一个有序数组;
  3. 最终直到剩下两个有序子数组,将其合并为一个总的有序大数组。

算法实现

代码在xcode中验证,可以直接使用
//新建一个临时数组,用来存放排序好的元素
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)的更多相关文章

  1. 归并排序 MergeSort

    今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来. 学习链接:排序七 归并排序.图解排序算法(四)之归并排序 merge函数:将两个有序序列 ...

  2. 排序算法THREE:归并排序MergeSort

    /** *归并排序思路:分治法思想 O(nlogn) * 把数组一分为二,二分为四 * 四和为二,二和为一 * */ /** * 归并排序主方法 *@params 待排序的数组 *@params 初始 ...

  3. 普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort

    起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...

  4. 分治法——归并排序(mergesort)

    首先上代码. #include <iostream> using namespace std; int arr[11]; /*两个序列合并成一个序列.一共三个序列,所以用 3 根指针来处理 ...

  5. [图解算法] 归并排序MergeSort——<递归与分治策略>

    #include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...

  6. 《算法导论》归并排序----merge-sort

    伪代码请见<算法导论>2.3节 merge-sort实现: public class MergeSort {        public static void sort(double [ ...

  7. 算法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 ...

  8. C#数据结构与算法系列(二十三):归并排序算法(MergeSort)

    1.介绍 归并排序(MergeSort)是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解, 而治(conquer)的阶段则将分的阶段得 ...

  9. 排序算法——QuickSort、MergeSort、HeapSort(C++实现)

    快速排序QuickSort template <class Item> void quickSort (Item a[], int l, int r) { if (r<=l) ret ...

  10. POJ2299 Ultra-QuickSort(归并排序求逆序数)

    归并排序求逆序数   Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descri ...

随机推荐

  1. ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项

    ACE是一个跨平台的用于并发通信的C++框架,项目开始时使用的是ACE 5.6发布版,目前最新的ACE版本是6.3.0. 网上一直有一种黑ACE的氛围,主要黑点在于ACE的复杂和作者的背景,结合实际应 ...

  2. 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 ...

  3. [技巧篇]01.Servlet的优化模版代码

    Servlet.java的模版 #---------------------------------------------# # <aw:description>Template for ...

  4. js:鼠标移动到文字显示div,移出文字div显示,鼠标能移进div

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  5. Hibernate入门(3)- 持久对象的生命周期介绍

    在hibernate中对象有三种状态:瞬时态(Transient). 持久态(Persistent).脱管态或游离态(Detached).处于持久态的对象也称为PO(Persistence Objec ...

  6. python实现备份gitlab版本库并更改文件名

    脚本的功能是实现备份gitlab版本库,并修改备份后的文件名,成功后发送邮件至相关负责人,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...

  7. sudo: /usr/libexec/sudo/sudoers.so must be only be writable by owne

    1. chmod 644 sudoers.so 2. pkexec chmod 0440 /etc/sudoers

  8. 【LA】5135 Mining Your Own Business

    [算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...

  9. 无缝衔接demo

    如题. <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" con ...

  10. vmware安装ubuntu " Intel VT-x 处于禁用状态"

    vmware安装ubuntu " Intel VT-x 处于禁用状态" http://jingyan.baidu.com/article/fc07f98976710e12ffe51 ...