当前位置:编程学习 > C/C++ >>

归并排序

归并排序
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
排序思想:
将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
重复上述步骤,直到所有元素排序完毕
 
C++实现:
[cpp]  
/**************************** 
 *Name:归并排序_递归.cpp 
 *Tags:排序 递归 归并 
 *Note: 
 *****************************/  
   
#include<iostream>  
#define MAX_SIZE1000  
using namespacestd;  
   
template<typename Type> void MergeSort(Type *, int, int);  
template<typename Type> void Merge(Type *, int, int, int);  
   
int main()  
{  
      int len, i, array[MAX_SIZE];  
      cout << "Input the Size of thearray: ";  
      cin >> len;  
      for(i = 0; i < len; i++) {  
    cin>> array[i];  
      }  
      MergeSort(array, 0, len-1); //归并操作  
      cout << "After Sort: "<< endl;  
      for(i = 0; i < len; i++) {  
    cout<< array[i] << " ";  
      }  
      cout << endl;  
      return 0;  
}  
   
template<typename Type>  
voidMergeSort(Type *array, int start, int end)  
{  
      if(start < end) {  
    intmiddle = (start + end) / 2;  
   MergeSort(array, start, middle); //归并排序  
   MergeSort(array, middle+1, end);  
   Merge(array, start, middle, end); //归并操作  
      }  
}  
   
template<typename Type>  
void Merge(Type*array, int start, int middle, int end)  
{  
      int i, j, t;  
      Type *temp = new Type[end-start+1];  
      i = start;  
      j = middle+1;  
      t = 0;  
      while(i <= middle && j <=end) {  
    if(array[i] < array[j]) {  
            temp[t++] = array[i];  
            i++;  
    }else {  
            temp[t++] = array[j];  
            j++;  
    }  
      }  
      while(i <= middle) {  
   temp[t++] = array[i++];  
      }  
      while(j <= end) {  
   temp[t++] = array[j++];  
      } //归并过程  
      for(i = 0; i < t; i++) {  
   array[i+start] = temp[i];  
      }  
      delete [] temp;  
}      
 
 
归并排序的速度次于快速排序,但是它是一个稳定的排序算法。归并排序的时间复杂度为O(nlogn),它的最好,最坏,平均时间复杂度一样,空间复杂度为O(n),主要是在归并操作时需要额外的空间。
 
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,