归并排序基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?
可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。这样通过先递归的分解数列,再合并数列就完成了归并排序。
#include <iostream> #include <string> #include <algorithm> #include <vector> #include <math.h> using namespace std; void print(int a[],int n){ for(int i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } //将有二个有序数列a[first...mid]和a[mid+1...last]合并。 void mergearray(int a[], int first, int mid, int last, int temp[]) { int i=first,m=mid; int j=mid+1,n=last; int k=0; while(i<=m && j<=n){ if(a[i]<a[j]){ temp[k++]=a[i]; i++; }else{ temp[k++]=a[j]; j++; } } while(i<=m){ temp[k++]=a[i]; i++; } while(j<=n){ temp[k++]=a[j]; j++; } // copy back to a for(int 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); } } int main() { //测试 int N = 10; int A[]={9,12,17,30,50,20,60,65,4,19}; int B[]={9,12,17,30,50,4,20,60,65,70}; int *temp=new int[N]; mergesort(A,0,N-1,temp); print(temp,N); return 0; }
归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是 一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在 O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。
原文地址:http://www.cnblogs.com/corolla/p/3839958.html