核心思想:采用分治法,将数组划分成两部分,每次对这两部分进行合并。
例如:49, 38, 65, 97, 38, 76, 13, 27
第一趟:
49 38 ——> 38 49
65 97 ——> 65 97
38 76 ——> 38 76
13 27 ——> 13 27
第二趟:
38 49
65 97 ——> 38 49 65 97
38 76
13 27 ——> 13 27 38 76
第三趟:
38 49 65 97
13 27 38 76 ——> 13 27 38 38 49 65 76 97
#include <iostream>
#include <vector>
using namespace std;
void merge(vector<int>& nums, int left, int mid, int right) {
vector<int> temp;
int cur = mid + 1;
int l = left;
while (left <= mid && cur <= right) {
if (nums[left] < nums[cur]) temp.push_back(nums[left++]);
else temp.push_back(nums[cur++]);
}
while (left <= mid) temp.push_back(nums[left++]);
while (cur <= right) temp.push_back(nums[cur++]);
cur = l;
for (; l <= right; ++l) nums[l] = temp[l - cur];
}
void mergeSort(vector<int>& nums, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
}
int main() {
vector<int> nums = { 49, 38, 65, 97, 38, 76, 13, 27 };
mergeSort(nums, 0, nums.size() - 1);
return 0;
}