我們知道把兩個已經排好序的數組合并成一個是很容易,也非常快的.於是根據這種思路就有個歸併排序.
歸併排序(Merge Sort)
並歸排序利用了遞迴的思想,把數組分割成很多小的數組序列,然後兩兩合并,最終整個數組有序.因為遞迴到一個子數組序列只有一個元素時,然後將這樣的數組合并就得到2個元素的有序數組,依次類推.
//合并兩個子數組序列,以mid為中間點,begin,end為前後界限,分割成兩個子序列.
void MergeSortedArr(int* arr, int begin , int mid , int end, int* tmpArr)
{
int lBegin = begin; //左邊序列的起始索引號
int lEnd = mid; //左邊序列的最後索引號
int rBegin = mid + 1;
int rEnd = end;
int k = 0; //兩個子序列元素個數之和
while( lBegin <= lEnd && rBegin <= rEnd) //當有一個子序列遍曆完了退出迴圈
{
if(arr[lBegin] <= arr[rBegin])
tmpArr[k++] = arr[lBegin++];
else
tmpArr[k++] = arr[rBegin++];
}
while(lBegin <= lEnd)
tmpArr[k++] = arr[lBegin++];
while(rBegin <= rEnd)
tmpArr[k++] = arr[rBegin++];
for(int i = 0; i < k; i++)
arr[begin + i] = tmpArr[i];
}
void MegerSort(int* arr, int begin , int end, int* tmpArr)
{
if( begin < end)
{
int mid = (begin + end) /2;
MergeSort(arr, begin , mid , tmpArr) ; //將左邊序列排序
MergeSort(arr, mid + 1, end, tmpArr); //將右邊序列排序
MergeSortedArr(arr, begin , mid, end, tmpArr); //合并兩個序列
}
}
測試代碼:
int arr[] = { 1,3,2,4,5,7,6,8,9};
int len = sizeof(arr)/sizeof(int);
int* tmpArr = new int[len];
MergeSort(arr, 0, len - 1, tmpArr);
delete []tmpArr;