合并排序
View Code
#include <stdio.h> void merge(int A[],int tmp[],int left,int right,int end); void mergeSort(int A[],int tmp[],int begin,int end); void mergeSort(int A[],int tmp[],int begin,int end){ if((end-begin)>0){ int mid=begin+(end-begin)/2; mergeSort(A,tmp,begin,mid); mergeSort(A,tmp,mid+1,end); merge(A,tmp,begin,mid+1,end); } } void merge(int A[],int tmp[],int left,int right,int end){ int i=left;int j=right; int m=left; while(i<right&&j<=end){ if(A[i]>A[j]){ tmp[left++]=A[i]; i++; } if(A[i]<=A[j]){ tmp[left++]=A[j]; j++; } } if(i==right){ while(j<=end){ tmp[left++]=A[j++]; } } if(j>end){ while(i<right){ tmp[left++]=A[i++]; } } for(;m<=end;m++){ A[m]=tmp[m]; } } int main(){ int A[5]={3,1,5,4,2}; int tmp[6]; mergeSort(A,tmp,0,4); int i=0; for(;i<5;i++){ printf("%d ",A[i]); } return 0; }
合并排序利用了分治的思想,无论好坏,时间复杂度都为O(N logN),因为分治后的高度为logN,每次比较都要进行N次。但是它需要和数组一样规模的额外空间。

浙公网安备 33010602011771号