歸併排序C語言程式碼
阿新 • • 發佈:2019-02-01
#include<stdio.h> #include<stdlib.h> void merge(int *A,int p,int q,int r);//合併 void merge_sort(int *A,int p,int r);//歸併排序,遞迴 int get_length(int *A);//獲取陣列長度 int main() { int n=0; int A[100]={1,45,9,90,46,456,3,78,234,23,76,345,863,47}; merge_sort(A,0,get_length(A)-1); while(A[n]!='\0') {printf("%6d",A[n]); n++; } return 1; } void merge_sort(int *A,int p,int r) { int q; if(p<r) { q=(p+r)/2; merge_sort(A,p,q); merge_sort(A,q+1,r); merge(A,p,q,r); } } void merge(int *A,int p,int q,int r) { int i=0,j=0,k; int num1=q-p+1; //A[p..q] int num2=r-q; //A[q+1..r] int *L1=(int *)malloc(sizeof(int)*(num1+1)); //最後一個元素存放一個足夠大的值,做哨兵元素,簡化操作 int *L2=(int *)malloc(sizeof(int)*(num2+1)); for(k=0;k<num1;k++) //將A[]中的元素分配到申請的空間中 L1[k]=A[p+k]; L1[k]=1000000; for(k=0;k<num2;k++) L2[k]=A[q+1+k]; L2[k]=1000000; for(k=0;k<r-p+1;k++) { if(L1[i]<=L2[j]) {A[p+k]=L1[i]; i++; } else { A[p+k]=L2[j]; j++; } } free(L1); free(L2); } int get_length(int *A) { int len=0; while(A[len]!='\0') len++; return len; }