归并排序
基本思想是把待排序的元素分解成两个规模大致相等的子序列,如果不易分解,将得到的子序列继续分解,直到子序列中包含的元素个数为1。
时空复杂度和稳定性
时间复杂度
O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度
归并的空间复杂度就是临时数组和递归时压入栈的数据占用的空间n+logn,所以空间复杂度是
O
(
n
)
O(n)
O(n)
稳定性
归并排序是稳定的。合并过程中可以保证如果两个当前元素相等时,把处于前面的序列的元素保存在结果序列前面,这样就保证了稳定性。
代码
class Solution {
private:
vector<int> tmp;
void mergeSort(vector<int>& nums, int begin, int end) {
if (begin>=end) return;
int mid=(begin+end)/2;
mergeSort(nums,begin,mid);
mergeSort(nums,mid+1,end);
int i = begin, j = mid + 1;
int cnt = 0;
while (i <= mid && j <= end) {
if (nums[i] <= nums[j]) {
tmp[cnt++] = nums[i++];
}
else {
tmp[cnt++] = nums[j++];
}
}
while (i <= mid) {
tmp[cnt++] = nums[i++];
}
while (j <= end) {
tmp[cnt++] = nums[j++];
}
for (int i = 0; i < end-begin + 1; ++i) {
nums[i + begin] = tmp[i];
}
}
public:
vector<int> sortArray(vector<int>& nums) {
tmp.resize((int)nums.size(), 0);
mergeSort(nums,0,nums.size()-1);
return nums;
}
};