设子数组A[0:k]和A[k+1:N-1]已排好序(0≤K≤N-1)。试设计一个合并这2个子数组为排好序的数组A[0:N-1]的算法。要求算法在最坏情况下所用的计算时间为O(N),只用到O(1)的辅助空间。
//翻转字符串时间复杂度O(to - from)
void reverse(int *a, int from, int to) {
int t;
for (; from < to; ++from, --to) {
t = a[from];
a[from] = a[to];
a[to] = t;
}
}
//循环右移num位 时间复杂度O(n)
void RightRotate(int *a, int begin, int len) {
reverse(a, 1, len - begin);
reverse(a, len - begin + 1, len);
reverse(a, 1, len);
}
void incoperateArray(int* arr, int len, int k) {
int i = 0;
int end = k + 1;
while (end < len) {
if (arr[i] > arr[end]) {
RightRotate(arr + i - 1, 1, end - i + 1);
end++;
}
i++;
}
}