归并排序
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
vector<int> res(nums.size(), 0);
MergeSort(nums, 0, nums.size(), res);
return res;
}
// 归并排序
void MergeSort(vector<int>& nums, int x, int y, vector<int>& res) {
if (y - x > 1) {
// 让中点向左边界x靠近
int m = x + (y - x) / 2;
MergeSort(nums, x, m, res);
MergeSort(nums, m, y, res);
int i = x;
int j = m;
int pos = x;
while (i < m || j < y) {
// 右半边为空或者左半边的值小于右半边
if (j >= y || (i < m && nums[i] < nums[j])) res[pos++] = nums[i++];
else res[pos++] = nums[j++];
}
for (int i = x; i < y; ++i) nums[i] = res[i];
}
}
};
逆序对个数
剑指 Offer 51. 数组中的逆序对
代码同归并排序,只需在合并时增加数量统计
int reversePairs(vector<int>& nums) {
vector<int> sortNums(nums.size(), 0);
return MergeSort2(nums, 0, nums.size(), sortNums);
}
int MergeSort2(vector<int>& nums, int x, int y, vector<int>& sortNums) {
int res = 0;
if (y - x > 1) {
int m = x + (y - x) / 2;
int L = MergeSort2(nums, x, m, sortNums);
int R = MergeSort2(nums, m, y, sortNums);
int i = x;
int j = m;
int pos = x;
int cnt = 0;
while (i < m || j < y) {
if (j >= y || (i < m && nums[i] <= nums[j])) {
sortNums[pos++] = nums[i++];
}
else {
sortNums[pos++] = nums[j++];
cnt += m - i;
}
}
for (int i = x; i < y; ++i) nums[i] = sortNums[i];
res += L + R + cnt;
}
return res;
}