归并排序算法
归并排序
归并排序(merge sort) 是利用
归并
的思想实现的排序算法,该算法采用经典的分治(divide-and-conquer)
策略。分治法将问题
分(divide)
成一些小的问题然后递归求解,而治(conquer)
的阶段则将分的阶段得到的答案修补
在一起,即分而治之。
算法思想
先把这个要排序的数组划分为两份,然后再把子数组再次二分,直到数组的大小为1;然后从低端开始向上合并,合并的过程对每一个子数组进行排序。
算法步骤
- 确定分界点:mid = l + r >> 1;
- 递归排序左右两个子区间
- 归并——合二为一:合并的过程对每一个子序列进行排序。(用到双指针算法)
其中最重要的就是第三步:归并
归并的过程:
代码模板
C++代码
void merge_sort(int q[], int l, int r){
if(l >= r) return; //递归边界
int mid = l + r >> 1; //确定分界点mid
merge_sort(q, l, mid); //递归处理左序列
merge_sort(q, mid + 1, r); //递归处理右序列
int temp[r - l + 1]; //临时数组
int i = l, j = mid + 1, k = 0; //左右指针初始的位置
while(i <= mid && j <= r){ //归并合二为一
if(q[i] <= q[j]) temp[k ++] = q[i ++];
else temp[k ++] = q[j ++];
}
//退出循环的两种情况:左半边走完 或 右半边走完
while(i <= mid) temp[k ++] = q[i ++]; //将左边剩余元素填充进temp数组中
while(j <= r) temp[k ++] = q[j++]; //将右边元素填充进temp数组中 这两个while语句 只会执行其中一个
for(int i = l, j = 0; i <= r; i ++, j ++) q[i] = temp[j]; //将temp数组拷贝到原数组中
}
本文作者:Ac_c0mpany丶
本文链接:https://www.cnblogs.com/keyongkang/p/15136895.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步