复习梗概
- 画图,自己整个数组,看代码写步骤,这个对理解归并排序还是很有必要的
- 合并两个有序数组的merge函数写法
- 时间复杂度的分析方法!!!
- 其实我觉得去b站找个动态的步骤分解视频也是不错的复习方法,当然要自己先回想
归并排序特点
- 稳定,快速
- 递归调用,分治思想
- 合并两个有序数组的思想
- 时间复杂度O(nlogn),这个时间复杂度的分析方法很重要一定要掌握
归并排序时间复杂度分析(某校知能情报考过)
恋上数据结构笔记 归并排序与时间复杂度
这个图可能会很有用
图片来自:恋上数据结构结构与算法第二季-李明杰老师
归并排序本体函数
从输出也能大致看出来归并排序的归并顺序,每次merge都会打印一次数组
图片来自:恋上数据结构结构与算法第二季-李明杰老师
void mergeSort(vector<int> &array, int begin, int end)
{
//有点类似树的递归访问,每次调用都把当前数组一分为二,直到不可再分就return,两个都return后,merge成一个有序数组,再不断往回merge成有序数组
if (end - begin + 1 < 2)
{
return;
}
int mid = (begin + end) / 2;
mergeSort(array, begin, mid);
mergeSort(array, mid+1, end);
merge(array, begin, end);
vectorPrint(array);
}
输入数组:
6 9 3 1 2 0 8 29 15 11 10
归并排序基础版
6 9 3 1 2 0 8 29 15 11 10
3 6 9 1 2 0 8 29 15 11 10
3 6 9 1 2 0 8 29 15 11 10
3 6 9 0 1 2 8 29 15 11 10
0 1 2 3 6 9 8 29 15 11 10
0 1 2 3 6 9 8 29 15 11 10
0 1 2 3 6 9 8 15 29 11 10
0 1 2 3 6 9 8 15 29 10 11
0 1 2 3 6 9 8 10 11 15 29
0 1 2 3 6 8 9 10 11 15 29
算法用时:(微秒)
[AlgoTime: 20007 us]
输入数组:
6 9 3 1 2 0 8 29 15 11 10
归并排序归并换个写法
6 9 3 1 2 0 8 29 15 11 10
3 6 9 1 2 0 8 29 15 11 10
3 6 9 1 2 0 8 29 15 11 10
3 6 9 0 1 2 8 29 15 11 10
0 1 2 3 6 9 8 29 15 11 10
0 1 2 3 6 9 8 29 15 11 10
0 1 2 3 6 9 8 15 29 11 10
0 1 2 3 6 9 8 15 29 10 11
0 1 2 3