主要思想
- 归并排序是一种分治算法,其排序过程包括分和治
- 分是指将要排序的序列一分为二、二分为四,直到单个序列中只有一个数
- 治是指在分完后,将每两个元素重新组合,四合为二、二合为一,最终完成排序
图片作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/p5l0js/
代码框架
void mergeSort(vector<int> nums, int low, int high) {
if(low>=high) return;//直到序列中只有单个元素
//分
...
//治
...
}
}
- 分:也就是一分为二的过程,类似二分查找,使用两个递归一次传入一半的序列
- 治:在分完后,新建一个临时数组,将要合并的内容先存储起来,然后使用两个下标从两个要合并的序列的开始处进行遍历比较,依次将正确顺序的元素存入原数组,当有一个下标超出其要遍历的序列时,直接将其他序列剩下的内容合并到原数组的后面
完整代码
在这里插入代码片void mergeSort(vector<int>& nums, int low, int high) {
if(low>=high) return;
int mid=(high+low)/2;
//分
mergeSort(nums, low, mid);
mergeSort(nums, mid+1, high);
//治
vector<int> temp;
temp.assign(nums.begin()+low, nums.begin()+high+1);
int i=0, j=mid-low+1;//用于在 temp 中遍历
for(int x=low; x<=high; ++x){
if(i==mid-low+1) nums[x]=temp[j++];
else if(j==high-low+1 || temp[j]>=temp[i]) nums[x]=temp[i++];
else nums[x]=temp[j++];
}
}
此处的>=保证排序结果稳定。
else if(j==high-low+1 || nums[j]>=nums[i]) nums[x]=temp[i++];
相关题目
148. 排序链表
LCR 170. 交易逆序对的总数