为了账号安全,请及时绑定邮箱和手机立即绑定

关于对归并排序的理解

标签:
数据结构

图片描述

图片描述

归并排序:至顶向下递归排序(详细请看C++算法课程,这篇手记主要目的是上传这两张图片):引用波波老师的代码://递归使用归并排序,对arr[l.....r]的范围进行排序
template<typename T>
void __mergeSort(T arr[], int l, int r) {

if (l >= r)
return;//当n小到一定程度时,Insertion Sort比Merge Sort快一些(因为前者的时间复杂度带的系数比后者的小)
// if ( r - l <= 15) {//记住这一点:第二个优化
// insertionSort(arr, l, r);
// return;
//}

int mid = (l+r)/2;//当数据量大时有可能发生溢出,毕竟int型;在这里不过多计较
***__mergeSort(arr, l, mid);***
***__mergeSort(arr, mid+1, r);***
if (arr[mid] > arr[mid+1])//记住这一点:针对于和有序的序列的优化(这种情况最好用Insertion Sort)
    __merge(arr, l, mid, r);

}
如上,加粗并是斜体的两句代码用了“递归操作”:对于第一句代码在图上就可以代表1234这一块,然后这一句是递归会继续调用这个函数就出现了下面的
12块和34块;接着12块(第一条递归语句)调用递归就出现了 1块和2块;接着1块递归遇到条件:if (l >= r)直接返回;之后会2块递归遇到条件if (l >= r)直接返回;然后执行第三条语句: merge(arr, l, mid, r);归并操作;1块和2块会被排序成为12块返回;这时候12块排好了序;就会34块(第二条递归语句)递归;分成3块 和 4块;接着3块(第一条递归语句)递归会遇到条件if (l >= r)直接返回;然后4块(第二条递归语句)递归会遇到条件if (l >= r)直接返回;接着会调用第三条语句: merge(arr, l, mid, r);对3块和4块排序成34块返回;这时候12块 和 34块都排序好了,就会执行第三条语句:__merge(arr, l, mid, r);把12块 和 34 块 进行归并返回1234块;1234块排序完成;接着会执行5678块(第二条递归语句)进行递归。。。。。。执行顺序和上面差不多

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
12
获赞与收藏
17

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消