归并排序算法 C代码实现

转载 2012年03月30日 08:04:30

合并排序(MERGE SORT)是又一类不同的排序方法,合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
  例如数组A有7个数据,分别是: 49 38 65 97 76 13 27,那么采用归并排序算法的操作过程如图7所示:
  初始值 [49] [38] [65] [97] [76] [13] [27]
  看成由长度为1的7个子序列组成
  第一次合并之后 [38 49] [65 97] [13 76] [27]
  看成由长度为1或2的4个子序列组成
  第二次合并之后 [38 49 65 97] [13 27 76]
  看成由长度为4或3的2个子序列组成
  第三次合并之后 [13 27 38 49 65 76 97]
  合并算法的核心操作就是将一维数组中前后相邻的两个两个有序序列合并成一个有序序列。合并算法也可以采用递归算法来实现,形式上较为简单,但实用性很差。合并算法的合并次数是一个非常重要的量,根据计算当数组中有3到4个元素时,合并次数是2次,当有5到8个元素时,合并次数是3次,当有9到16个元素时,合并次数是4次,按照这一规律,当有N个子序列时可以推断出合并的次数是X(2 >=N,符合此条件的最小那个X)。
  其时间复杂度为:O(nlogn).所需辅助存储空间为:O(n)
  归并算法如下:

#include<stdio.h>   

  1. #include<stdlib.h>   
  2. typedef int RecType;//要排序元素类型  
  3. void Merge(RecType *R,int low,int m,int high)  
  4. {  
  5.     //将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]  
  6.     int i=low,j=m+1,p=0;                //置初始值  
  7.     RecType *R1;                        //R1是局部向量  
  8.     R1=(RecType *)malloc((high-low+1)*sizeof(RecType));  
  9.     if(!R1)  
  10.     {  
  11.         return;                         //申请空间失败  
  12.     }  
  13.   
  14.     while(i<=m&&j<=high)                //两子文件非空时取其小者输出到R1[p]上  
  15.     {  
  16.         R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];  
  17.     }  
  18.   
  19.     while(i<=m)                         //若第1个子文件非空,则复制剩余记录到R1中  
  20.     {  
  21.         R1[p++]=R[i++];  
  22.     }  
  23.     while(j<=high)                      //若第2个子文件非空,则复制剩余记录到R1中  
  24.     {  
  25.         R1[p++]=R[j++];  
  26.     }  
  27.   
  28.     for(p=0,i=low;i<=high;p++,i++)  
  29.     {  
  30.         R[i]=R1[p];                     //归并完成后将结果复制回R[low..high]  
  31.     }  
  32. }  
  33.   
  34. void MergeSort(RecType R[],int low,int high)  
  35. {     
  36.     //用分治法对R[low..high]进行二路归并排序  
  37.     int mid;  
  38.     if(low<high)  
  39.     {   //区间长度大于1   
  40.         mid=(low+high)/2;               //分解  
  41.         MergeSort(R,low,mid);           //递归地对R[low..mid]排序  
  42.         MergeSort(R,mid+1,high);        //递归地对R[mid+1..high]排序  
  43.         Merge(R,low,mid,high);          //组合,将两个有序区归并为一个有序区  
  44.     }  
  45. }  
  46. void main()  
  47. {  
  48.     int a[7]={49,38,65,97,76,13,27}; //这里对8个元素进行排序  
  49.     int low=0,high=6;                   //初始化low和high的值  
  50.   
  51.     printf("Before merge sort: ");  
  52.     for(int i=low;i<=high;i++)  
  53.     {  
  54.         printf("%d ",a[i]);             //输出测试  
  55.     }  
  56.     printf("/n");  
  57.   
  58.     MergeSort(a,low,high);  
  59.   
  60.     printf("After merge sort:  ");  
  61.     for( i=low;i<=high;i++)  
  62.     {  
  63.         printf("%d ",a[i]);             //输出测试  
  64.     }  
  65.     printf("/n");  
  66. }   

http://www.cnblogs.com/jillzhang/archive/2007/09/16/894936.html

数据结构——归并排序算法

昨天说了快速排序,今天来讲一讲归并排序:什么是归并?归并:将两个或两个以上的有序表组合成一个新有序表。归并操作的步骤: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指...
  • u013271921
  • u013271921
  • 2015年05月26日 14:33
  • 6836

C语言之归并排序

即将两个都升序(或降序)排列的数据序列合并成一个仍按原序排列的序列。 上代码: #include #include #define m 6 #define n 4 int main()...
  • morixinguan
  • morixinguan
  • 2016年02月09日 20:07
  • 2771

分治法-----归并排序(C语言描述)

归并排序的基本思想: 将两个及其以上的有序表合并为一张有序表,把待排序序列通过分治法分为若干个有序子序列,然后每两个子序列合并为一个子序列,经过多次合并后整合为一张有序表。 排序过程如图:...
  • LCYong_
  • LCYong_
  • 2016年11月25日 15:16
  • 1462

排序(6)---------归并排序(C语言实现)

归并排序: 归并操作,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。 归并操作的过程如下: (1) 申请空间,使其大小为两个已经排序序列之和,该空间用...
  • u010590318
  • u010590318
  • 2014年06月29日 23:25
  • 2264

归并排序(C语言版)

#include #include #include #include void mergeSort(int array[], int size); void _mergeSort(int ...
  • Thinkpad4180NC5
  • Thinkpad4180NC5
  • 2014年10月03日 14:20
  • 1750

排序算法系列:归并排序(Merge sort)(C语言)

通俗理解:运用分而治之的思想,编写递归函数,将大数组排序转化为小数组排序,最后再将其合并。void merge_sort(int*p,int low,int high) { int mid = (l...
  • iluckyning
  • iluckyning
  • 2012年11月02日 15:47
  • 3658

归并排序C语言代码

#include #include void merge(int *A,int p,int q,int r);//合并 void merge_sort(int *A,int p,int r);//归...
  • ocean1171597779
  • ocean1171597779
  • 2013年09月07日 13:23
  • 587

数据结构之---C语言实现归并排序

数据结构之---C语言实现归并排序
  • u012965373
  • u012965373
  • 2015年09月08日 15:32
  • 1372

LUA 排序算法和性能分析[5]:插入排序算法

插入排序算法 时间开销:较长 稳定性: 复杂度: math.randomseed(os.time()); local real_print = print; local ...
  • warrially
  • warrially
  • 2017年12月20日 14:25
  • 23

归并排序--自上而下和自下而上两种方法的实现

归并排序思想 自上而下的递归 对一个数组(str)选中一个中间位置(mid=(start+end)/2),分别进行左递归(mergeSort(str,start,mid,length)),右递归(m...
  • wyfhist
  • wyfhist
  • 2015年07月20日 19:21
  • 1550
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序算法 C代码实现
举报原因:
原因补充:

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