軟體設計師演算法之分治法--歸併排序
阿新 • • 發佈:2019-01-09
最近準備要考中級軟體設計師。該門考試涉及到演算法相關的,剛好也順帶著整理下之前自己學習過的知識。
演算法的學習沒有什麼捷徑,就是理解演算法思想和邏輯。最重要的一點,一定要自己編寫程式碼,除錯通過,這樣才算是完成了演算法的學習。
2路歸併排序就是每次都劃分陣列為前後2半,對這2半再次劃分為2半,如此遞迴劃分之後只剩下1個元素。1個元素當然是有序的,這時候遞迴也是到了最底層,接著就是開始向上歸併了。歸併的時候就是把前一半元素(有序的)和後一半元素(有序的)進行插入排序。一直歸併到陣列全部有序,如此就完成了整個排序過程。
編寫的程式碼如下:
static void Merge(int dataSrc[],int start,int mid,int end) { int frontIndex = 0; int rearIndex = 0; int dstIndex = start; /* 如果不申請臨時空間,那麼每次歸併插入資料的時候可能會移動大量資料*/ int* pTempFront = (int*)new int[mid-start+1]; int* pTemRear = (int*)new int[end-mid]; memcpy(pTempFront,&dataSrc[start],sizeof(int)*(mid-start+1)); memcpy(pTemRear,&dataSrc[mid+1],sizeof(int)*(end-mid)); for(frontIndex=0,rearIndex=0;(frontIndex<(mid-start+1))&&(rearIndex<(end-mid));) { if(pTempFront[frontIndex] > pTemRear[rearIndex]) { dataSrc[dstIndex++] = pTemRear[rearIndex++]; } else { dataSrc[dstIndex++] = pTempFront[frontIndex++]; } } for(;frontIndex<(mid-start+1);frontIndex++) { dataSrc[dstIndex++] = pTempFront[frontIndex]; } for(;rearIndex<(end-mid);rearIndex++) { dataSrc[dstIndex++] = pTemRear[rearIndex]; } delete []pTempFront; delete []pTemRear; } void static MergeSortHelp(int dataSrc[],int start,int end) { if(start < end) { int mid = (start+end)/2; MergeSortHelp(dataSrc,start,mid); MergeSortHelp(dataSrc,mid+1,end); Merge(dataSrc,start,mid,end); } } void MergeSort(int data[],int dataLen) { MergeSortHelp(data,0,dataLen-1); }