归并排序算法实现的个人理解

原创 2018年04月15日 16:23:41

归并排序算法递归实现的个人理解


递归与非递归两种实现方案(使用C++实现)


首先介绍一下归并排序实现的基本思路
1.将数组array[n]对半划分,依次进行下去,直至得到n/2个子数组
2.对这n/2个数组依次进行排序
3.继续将数组进行划分,得到n/4个数组,由于之前的n/2个子数组已经排序完成,所以实际上是将上面的n/2个数组合并成排序完成的n/4个数组,并排序,依次类推至最终得到的n/n(即1)个数组则为排序完成的数组


代码实现如下:
首先介绍将子数组进行合并排序的函数

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++];  
    }  
//将剩下的元素赋值给temp
    while (j <= n)  
        temp[k++] = a[j++];  

    while (i <= m)  
        temp[k++] = a[i++];  
//将排序成功的temp数组里面的值赋值给原数组
    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  

递归实现排序

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); //再将二个有序数列合并  
    }  
}  

非递归实现

void MergeSort(int a[],int n){
    int* temp = new int(n);
    int size = 1,first,mid;//size为每次子数组的大小/2 
    while(size<n){
        first=0;
        while(first+size<n){
            mid = first+size-1;//得到每次要归并的数组的中间下标
            //归并数组的最后一个下标若超过数组大小则按n-1处理
            mergesort(a,first,mid+size>n-1?n-1:mid+size,temp);
            cout<<"first:"<<first<<" mid:"<<mid<<" last:"<<(mid+size>n-1?n-1:mid+size)<<endl;//打印出每次归并的区间   
            first = mid+size+1;
        }
        size*=2;
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/madonghyu/article/details/79950323

深入理解远程调用之Hessian

-
  • 1970年01月01日 08:00

手摇算法(三重翻转算法)和空间复杂度为o(1)的归并排序

http://blog.csdn.net/ltyqljhwcm/article/details/52155097?locationNum=6&fps=1这篇文章对手摇算法以及归并排序有很详细的讲解!!...
  • u010141928
  • u010141928
  • 2017-06-21 11:52:46
  • 182

我对归并排序的理解

归并排序总体来说比较简单,其适应场所是对已经排序好的几个序列整合成一个总的排序好的序列。根据其特点,对于已经排序好的几个序列,只需依次取其第一个元素比较,较小的放在新序列里。对于一个数组的情况,先将其...
  • lengjinghk
  • lengjinghk
  • 2016-03-08 14:47:22
  • 865

由合并排序算法谈如何理解递归

今天早上突然来了兴致,拿起了尘封多月的《算法导论》翻看起来,正好看到合并排序一章,看完介绍后自己动手编程实现,经过简单的调试纠错后程序正确执行,但是细细一品其中用到的递归知识,感觉糊里糊涂,有种只知表...
  • yuanbohx
  • yuanbohx
  • 2011-08-02 08:46:11
  • 3318

归并排序算法的理解

归并排序:先对两个有序的系列进行合并,合并的时候不断的对两个系列的第一个元素进行比较,把较小的那个移动到最前面成为了第一个元素,那么移动的元素后面的元素就是成为了下次比较的序列的第一个元素,如此不断的...
  • chenxun2009
  • chenxun2009
  • 2014-11-02 23:01:26
  • 1481

利用手摇法实现原地归并排序

本文转载自原地归并排序 以下面的数组为例介绍原地归并排序的原理。 开始时i,j分别指向这个数组的两个有序子序列的第一个值,然后i向后移动,直到找到比20大的值,即移动到30。此时,i之...
  • qq_32400847
  • qq_32400847
  • 2016-08-28 12:07:53
  • 550

经典算法之归并排序的C实现方法

以前写过归并排序的算法,但是时间过了好久,忘记怎么写的了,(也是醉了)。正好复习算法的时候遇到这个问题,就重新写了一下,把遇到的一些问题顺便记录一下。核心就是用两个子数组记录分割后的两个数组中的变量,...
  • zhyh1435589631
  • zhyh1435589631
  • 2015-06-06 16:00:56
  • 1233

“深入理解”—归并排序算法

关于归并排序的一个初步学习总结
  • qq_25827845
  • qq_25827845
  • 2017-04-30 10:50:17
  • 2734

简单排序算法实现——归并排序

归并排序(Merge Sort) 是一种采用了分治(Divide and Conquer) 想法的排序算法。 该算法中基本的操作是合并两个已经排序的表,并将输出放到第三个表中,该过程可以通过...
  • a454042522
  • a454042522
  • 2013-01-29 21:18:53
  • 449

归并排序算法原理及JAVA实现

基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。递归形式的算法在形式上较简...
  • xuxurui007
  • xuxurui007
  • 2012-06-11 23:10:01
  • 1015
收藏助手
不良信息举报
您举报文章:归并排序算法实现的个人理解
举报原因:
原因补充:

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