歸併排序 -
採用了分治和遞歸的思想,遞歸&分治-排序整個數列如同排序兩個有序數列,依次執行這個過程直至排序末端的兩個元素,再依次向上層輸送排序好的兩個子列進行排序直至整個數列有序(類比二叉樹的思想,from down to up)。
時間複雜度:O(NlogN) 穩定性:穩定
/*歸併排序*/
//排序兩個有序數列
void mergeSortInOrder(vector<int> &arr, int bgn, int mid, int end)
{
int *pBuf = new int[end - bgn];
int *pTemp = pBuf;
int lindex = bgn;
int rindex = mid;
while ((lindex < mid) && (rindex < end))
*(pTemp++) = (arr[lindex] < arr[rindex]) ? arr[lindex++] : arr[rindex++];
while (lindex < mid)
*pTemp++ = arr[lindex++];
while (rindex < end)
*pTemp++ = arr[rindex++];
//pTemp -> arr
pTemp = pBuf;
for (int i = bgn; i < end; i++)
arr[i] = *pTemp++;
delete []pBuf;
}
//UpToDown To DownToUp
void mergeSort(vector<int> &arr, int bgn, int end)
{
//數組arr空or僅有一個元素則退出
if (bgn >= end - 1)
return;
int mid = (bgn + end) / 2;
mergeSort(arr, bgn, mid);
mergeSort(arr, mid, end);
mergeSortInOrder(arr, bgn, mid, end);
}