#include <stdio.h> int merge(int r[],int s[],int x1,int x2,int x3) //自定義實現一次歸併樣序的函數 { int i,j,k; i=x1; //第一部分的開始位置 j=x2+1; //第二部分的開始位置 k=x1; while((i<=x2)&&(j<=x3)) //當i和j都在兩個要合併的部分中時 if(r[i]<=r[j]) //篩選兩部分中較小的元素放到陣列s中 { s[k] = r[i]; i++; k++; } else { s[k]=r[j]; j++; k++; } while(i<=x2) //將x1?x2範圍內未比較的數順次加到陣列r中 s[k++]=r[i++]; while(j<=x3) //將x2+l?x3範圍內未比較的數順次加到陣列r中 s[k++]=r[j++]; return 0; } int merge_sort(int r[],int s[],int m,int n) { int p; int t[20]; if(m==n) s[m]=r[m]; else { p=(m+n)/2; merge_sort(r,t,m,p); //遞回呼叫merge_soit()函數將r[m]?r[p]歸併成有序的t[m]?t[p] merge_sort(r,t,p+1,n); //遞回一呼叫merge_sort()函數將r[p+l]?r[n]歸併成有序的t[p+l]?t[n] merge(t,s,m,p,n); //呼叫函數將前兩部分歸併到s[m]?s[n】*/ } return 0; } int main() { int a[11]; int i; printf("請輸入10個數:n"); for(i=1;i<=10;i++) scanf("%d",&a[i]); //從鍵盤中輸入10個數 merge_sort(a,a,1,10); //呼叫merge_sort()函數進行歸併排序 printf("排序後的順序是:n"); for(i=1;i<=10;i++) printf("%5d",a[i]); //輸出排序後的資料 printf("n"); return 0; }
請輸入10個數:
695 458 362 789 12 15 163 23 2 986
排序後的順序是:
2 12 15 23 163 362 458 695 789 986