基于对merge操作的原地归并使得mergeSort空间复杂度为O(1)
/**
* @brief 数组al[0, mid-1] 和 al[mid, num-1]是各自有序的,对两个子段进行Merge得到al[0,
* num-1]的有序数组。 要求空间复杂度为O(1)
*
* 方案:
* 1. 两个有序段位A和B,A在前,B紧接在A后面。找到A的第一个大于B[0]的数A[i]. A[0,
* i-1]相当于merge后的有效段。在B中找到第一个大于A[i]的数B[j]。 对数组A[i, lenA+j]循环右移j位.
* 2. 如此循环merge
* 3. 循环右移通过先子段反转再整体反转的方式进行,复杂度是O(L), L是需要循环移动的子段的长度
*
* */
void sortedListMergeO1(int *al, int num, int mid)
{
if (NULL == al || mid >= num || 0 >= mid) return ;
int i = 0;
int j = mid;
while (i < num) {
while (al[i] < al[j]) ++i;
int step = j;
while(al[j] < al[i]) ++j;
step = j - step;
rotateRight(al, i, j, j - step);
i += step;
}
return ;
}