Q:数组a[0,mid-1] 和 a[mid,num-1],都分别有序。将其merge成有序数组a[0,num-1],要求空间复杂度O(1)。
数组al一共有num个元素。前mid个元素和后num-mid个元素均是有序,要求对整个数组排序。
A: 这题我用到了两个算法
1 O(N)复杂的的顺序选择算法,即O(N)时间内找出无序数组中第k小的数。
2 字符串翻转算法 即abc|de -> de|abc,这个算法时间复杂度也是O(N)。
这道题mid并不一定要是中间位置。
首先,找出数组a的中位数K,此时数组a[0,mid-1]有i个元素>=K, a[mid,num-1]有j个元素<=K,如下图,我们把这i个元素和j个元素分别看做两个部分,交换这两部分数字,即从1 5 6 7 | 2 3 8 => 1 2 3 | 5 6 7 8。
此时可以确定前面一般的元素都是有序的。但是后面一半元素还没有排好序。
没错,这时候自然是用递归的方法做下去了。那么时间复杂度是多少呢?我们写出算法递归方程。
T(N) = T(N/2) + O(N)
根据主定理可以证明复杂度为O(N)。