归并排序

原创 2016年06月01日 16:58:51

1.归并排序的概念

  • 将待排序元素分成两个区间,用递归思想将两个区间进行排序。
  • 将 两个排好的有序区间的元素进行合并。

2.归并排序的思想

  • 分治思想
  • 递归思想(区间的不断缩小)

3.归并排序的的实现


3.1先从简单的合并开始

//将有序数组a[]和b[]合并到c[]中  
void MemeryArray(int a[], int n, int b[], int m, int c[])  
{  
    int i, j, k;  

    i = j = k = 0;  
    while (i < n && j < m)  
    {  
        if (a[i] < b[j])  
            c[k++] = a[i++];  
        else  
            c[k++] = b[j++];   
    }  

    while (i < n)  
        c[k++] = a[i++];  

    while (j < m)  
        c[k++] = b[j++];  
} 

3.2 类比上面,然后已经分出来的区间进行合并

void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  

    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  

    while (i <= m)  
        temp[k++] = a[i++];  

    while (j <= n)  
        temp[k++] = a[j++];  

    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
} 

3.3 对整个待排序元素进行分割,然后合并。

void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左边有序  
        mergesort(a, mid + 1, last, temp); //右边有序  
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并  
    }  
}  

3.4 主函数,以及待排序元素的输入解决

bool MergeSort(int a[], int n)  
{  
    int *p = new int[n];  //int *p =(int *) malloc(sizeof(int)*n);
    if (p == NULL)  
        return false;  
    mergesort(a, 0, n - 1, p);  
    delete[] p;  
    return true;  
}  

参考

版权声明:本文为博主原创文章,未经博主允许不得转载。

归并排序及代码实现

自己实现归并排序+快速排序,二者都是嵌套加递归 归并排序: //归并排序 #include #include using namespace std; void merge_sort(i...
  • chuchus
  • chuchus
  • 2014年03月22日 20:30
  • 1397

利用Python实现归并排序

在讲归并排序之前我们先来了解一下什么是分治算法。为什么归并排序属于分治算法的体现。 分治算法分治算法基本思想就是将一个比较大规模的问题分解成为若干个规模较小的问题来解决。这些小问题相当于是原问题的子集...
  • minxihou
  • minxihou
  • 2016年07月04日 15:09
  • 2169

归并排序及其应用

1 归并排序的特点归并排序是一种利用分治技术来实现一种稳定排序算法,该算法的时间复杂度为O(nlogn),该算法的常数因子比较大,通常应用于数据量比较大的场合。通常,我们所学习的归并排序算法都是二路归...
  • mitedu
  • mitedu
  • 2009年02月12日 16:22
  • 2923

算法系列(四)排序算法中篇--归并排序和快速排序

在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。 概述 冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序...
  • robertcpp
  • robertcpp
  • 2016年05月30日 23:04
  • 3432

【排序】归并排序(递归和非递归版本)

#include using namespace std; void merge(int* a, int* temp, int begin, int middle, int end){ int i...
  • ruan875417
  • ruan875417
  • 2016年05月14日 13:47
  • 818

归并排序(视频+详解+代码)

归并排序 概述:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到...
  • dreamzuora
  • dreamzuora
  • 2016年10月16日 15:38
  • 993

二路归并排序算法(递归&非递归)

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的...
  • prstaxy
  • prstaxy
  • 2012年11月09日 14:31
  • 17522

排序算法之 归并排序 及其时间复杂度和空间复杂度

在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序;归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015年03月12日 16:16
  • 18290

算法设计之归并排序(C++实现)

归并排序遵循分治法的思想:将
  • u011426031
  • u011426031
  • 2014年08月23日 07:27
  • 3356

[STL] List 中sort为什么采用归并排序

这几天在看STL(SGI版本----侯捷),在看完第一章后有点懵,但还是很震撼,STL的设计理念确实很好,至于有多么好我们都懂,所以就不再评价了。      由于刚刚开始看,所以有些东西并不是很透彻,...
  • zr1076311296
  • zr1076311296
  • 2016年05月22日 19:07
  • 803
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序
举报原因:
原因补充:

(最多只允许输入30个字)