基于对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 ;
}