归并排序 -
采用了分治和递归的思想,递归&分治-排序整个数列如同排序两个有序数列,依次执行这个过程直至排序末端的两个元素,再依次向上层输送排序好的两个子列进行排序直至整个数列有序(类比二叉树的思想,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);
}