归并排序
函数入口
vector<int> sortArray(vector<int>& nums) {
if (nums.size() <= 1) {
return nums;
}
vector<int> temp(nums.size());
mergeSort(nums, 0, nums.size() - 1, temp);
return nums;
}
数组分割函数
5 2 3 4 1 分割成 5 2 3 和 4 1
5 2 3还可以继续分割成5 2 和 3
最后整个数组分割成5 2 和 3 和 4 1 三个部分
mergeSort函数只起到分割的作用
void mergeSort(vector<int>& nums, int start, int end, vector<int>& temp) {
if (start >= end) {
return;
}
mergeSort(nums, start, (start + end) / 2, temp);
mergeSort(nums, (start + end) / 2 + 1, end, temp);
merge(nums, start, end, temp);
}
合并函数
将nums数组从中间分割成两部分,将分割后的两个数组按照升序排列起来,前提是分割的两部分已经是排好序的了,类似于合并升序链表。
void merge(vector<int>& nums, int start, int end, vector<int>& temp) {
int mid = (start + end) / 2;
int left = start, right = mid + 1;
int index = left;
while (left <= mid && right <= end) {
if (nums[left] <= nums[right]) {
temp[index] = nums[left];
index++;
left++;
}
else {
temp[index] = nums[right];
index++;
right++;
}
}
while (left <= mid) {
temp[index] = nums[left];
index++;
left++;
}
while (right <= end) {
temp[index] = nums[right];
index++;
right++;
}
for (int i = start; i <= end; i++) {
nums[i] = temp[i];
}
}
};
记忆方法
1、第一步分割数组,第二步合并两个升序数组,第三步将原数组中乱序数组替换掉
2、注意合并升序数组时,left++,right++,index++