手记

关于对归并排序的理解

归并排序:至顶向下递归排序(详细请看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块(第二条递归语句)进行递归。。。。。。执行顺序和上面差不多

0人推荐
随时随地看视频
慕课网APP