几种常用的排序方法4--归并排序

归并排序

归并排序,又称为合并排序,它是把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。

使用的D&C的思想:

分解:将n个元素分解为各含n/2个元素的子序列;

解决:用合并排序法对两个子序列进行递归的排序;

合并:合并两个已经排好的子序列以得到正确结果。

归并排序的速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其最好,最坏,平均时间复杂度都是O(nlogn)。

 1 void Merge(int A[], int p, int q, int r)//对两个已经排好序的子数列进行合并 
 2 {
 3      int n1 = q - p + 1;//第一个子数列长度 
 4      int n2 = r - q; //第二个子数列长度 
 5      int L[n1+1], R[n2+1]; //左右两个子数列 
 6      for(int i = 1; i <= n1; i++)
 7      {
 8           L[i] = A[p+i-1];    //初始化 
 9      } 
10      for(int j = 1; j <= n2; j++)
11      {
12              R[j] = A[q+j];   //初始化 
13      }
14      L[n1+1] = MAXN;//哨兵值,前面定义MAXN为一个很大的数 
15      R[n2+1] = MAXN;//使用这个哨兵值是为了避免检查每个子序列是不是空的。所有的数都不会比它大 
16      int i = 1; 
17      int j = 1;
18      for(int k = p; k <= r; k++)//有序的分别将小的数重新插入元序列中 
19      {
20           if(L[i]<= R[j])
21           {
22                A[k] = L[i];    
23                i = i + 1;               
24           }           
25           else 
26           {
27                A[k] = R[j];
28                j = j + 1;     
29           } 
30      }       
31 } 
32 
33 void Merge_Sort(int A[], int p, int r)
34 {
35      if(p < r)
36      {
37           int q = (int)((p+r)/2);  //折半分解序列 
38           Merge_Sort(A,p,q);   //对左半部分进行归并排序 
39           Merge_Sort(A,q+1,r);  //对右半部分进行归并排序 
40           Merge(A,p,q,r);    
41      }     
42 } 

 

 

posted @ 2012-11-21 13:23  缓冲区溢出  阅读(516)  评论(0编辑  收藏  举报