排序——合並(歸並)排序
阿新 • • 發佈:2017-10-22
有序 pre sort left blog 只有一個 當前 code 兩個
原理圖:
實現代碼:
#define MAX 1000 //合並區間a[left,middel]和a[middle+1,right] void Merge(int a[],int left,int middle,int right) { int pleft=left; //給左右區間分別加上遊標 int pright=middle+1; int b[MAX]; int pb=0; while(pleft<=middle && pright<=right)//任何一個區間全部合並,結束循環 { if(a[pleft]<=a[pright]) { b[pb++] = a[pleft++]; //將a[pright]添加到數組b,並移動pright至下一個位置 } else //a[pleft] > a[pright] { b[pb++] = a[pright++]; } } while(pleft<=middle) { b[pb++] = a[pleft++]; } while(pright<=right) { b[pb++] = a[pright++]; }//再將合並成的數組b重新拷回給a int i,j; for(i=0,j=left;i<pb;i++,j++) { a[j] = b[i]; } } //將數組a[left,right]分成兩個區間分別排序,然後合並 void MergeSort(int a[],int left,int right) { int middle; if(left<right) //如果當前子區間只有一個元素就不再繼續劃分子區間了,這時MergeSort()會被跳過,直接執行Merge合並 { middle = (left+right)/2; MergeSort(a,left,middle); //對左區間進行排序 MergeSort(a,middle+1,right); //對右區間進行排序 Merge(a,left,middle,right); //合並線性表的原理,合並兩個有序的區間 } }
排序——合並(歸並)排序