1. 程式人生 > >關於歸並排序(模板)

關於歸並排序(模板)

並且 主函數 端點 pri ... 只需要 color 關於 16px

嗯...

歸並排序這個東西,主要用了分治的思想,並且有一點遞歸的意思...

詳細看代碼...

 1 #include<cstdio>
 2 using namespace std;
 3 int n,z[233],y[233];
 4 
 5 void merge_sort(int l,int r)//歸並排序,用到了分治的思想,兩個參數分別為左端點和右端點 
 6 {
 7     if (l==r) return;//l==r則它是空的 
 8     int m=(l+r)/2;//進行分治,m為它的中點 
 9     merge_sort(l,m);//將從第一個到m再進行歸並排序 
10 merge_sort(m+1,r);//將從m+1個到r再進行歸並排序 11 //註意直到分治成每一塊只有一個數據為止,一個類似遞歸的思想 12 int p1=l,p2=m+1;//將第一大塊的第一個數定義為p1,第二大塊的第一個數定義為p2,相當於指針 13 for (int a=l;a<=r;a++)//將所有數據進行循環搜索 14 { 15 if (p1 > m) //如果p1超出了第一塊的範圍 16 { 17 y[a] = z[p2];//那麽就將p2位置的數放入y數組 18 p2 ++;//
p2指針後移 19 } 20 else if (p2 > r)//如果p2超出了第二塊的範圍 21 { 22 y[a] = z[p1];//那麽就將p1位置的數放入y數組 23 p1++;//p1指針後移 24 } 25 else if (z[p1] < z[p2])//如果除了上述情況且p1位置的數比p2位置的數小 26 { 27 y[a] = z[p1];//則將p1位置的數放入y數組 28 p1++;//
p1指針後移 29 } 30 else//最後一種情況只需要用else即可 31 { 32 y[a] = z[p2];//p2位置的數放入y數組 33 p2 ++;//p2指針後移 34 } 35 } 36 for (int a=l;a<=r;a++) 37 z[a]=y[a];//將z數組更新,將排好序的序列放入z數組 38 } 39 40 int main() 41 { 42 //主函數進行讀入、調用、輸出 43 scanf("%d",&n); 44 for (int a=1;a<=n;a++) 45 scanf("%d",&z[a]); 46 merge_sort(1,n); 47 for (int a=1;a<=n;a++) 48 printf("%d\n",z[a]); 49 }

代碼很詳細,但好像批註很嘮叨....

相信能看懂....

關於歸並排序(模板)