算法导论——归并排序
#include<stdio.h> #define MAXN 100 //A[p,q] A[q+1,r]是两个有序数组,想办法把他们结合成一个有序数组 void merge(int A[],int p,int q,int r){ int n=0; int i=p; int j=q+1; int tmp[MAXN]; while(i<=q&&j<=r){ if(A[i]<=A[j]) tmp[n++]=A[i++]; else tmp[n++]=A[j++]; } while(i<=q) tmp[n++]=A[i++]; while(j<=r) tmp[n++]=A[j++]; int k; for(k=p;k<p+n;k++) A[k]=tmp[k-p]; } //归并排序主体 void merge_sort(int A[],int p,int r){ if(p<r){ int q=(p+r)/2; merge_sort(A,p,q); merge_sort(A,q+1,r); merge(A,p,q,r); } } int main(){ int A[]={2,56,3,7,86,1,6,43,12}; merge_sort(A,0,8); int k; for(k=0;k<=8;k++) printf("%d ",A[k]); printf("\n"); return 0; }