二路归并排序
来源:互联网 发布:libevent源码怎么读 编辑:程序博客网 时间:2024/06/06 03:48
交换排序:冒泡排序、快速排序(改进的)
1、基本思想:确定一个基准值,将所有元素划分为两个序列,前一序列元素比基准值小,后一序列元素比基准值大,再对两个子序列进行相同操作,每次划分都将确定一个基准值的最终位置。
2、标准快排(挖坑法)实现步骤:
- 假设数组为array,将每个序列的 第一个值作为基准值pivot;
- 初始化i,j:i为第一个元素所在位置,j为最后一个元素所在位置,当前坑为array[i];
- 如果array[j]>=pivot,那么j--, 否则array[i] = array[j],i++,当前坑为array[j];
- 如果array[i]<=pivot,那么i++,否则array[j] = array[i],j--,当前坑为array[i];
- 对于其余子序列也做相同操作,先j变化再i变化,直到i==j为止。
3、代码实现
4、时间复杂度
(1)最好情况:每次划分都从中间分成相等的两个子序列。每次定位基准值的位置需要的时间为O(n),那么
T(n) <= cn + 2T(n/2) = cn + 2(cn/2 + 2T(n/4)) = 2cn+4T(n/4)=2cn+4(cn/4+2T(n/8))=3cn+8T(n/8)=cnlogn+nT(1)=O(nlogn)
从另一个角度来看,快速排序的过程实际就是一棵递归树,树的深度logn就是递归的次数,每次对O(n)个元素排序,所以时间复杂度为O(nlogn);
(2)最坏情况:元素按照正序排列,每次划分后都只排序好基准值左边的序列,需要对右边的序列继续划分,则划分次数总共为n-1次,每次划分需要比较n-k次(1<k<n-1),那么
T(n) = n-1+n-2+n-3+...+1 = n(n-1)/2 = O(n^2)
(3)平均情况:T(n) = O(nlogn)
5、空间复杂度
每次递归都要是用一个栈,所以空间复杂度为O(logn)
6、稳定性:不稳定
7、改进快排
改进快排的着手点主要在基准值的选取上,基准值要选取的尽量能将序列划分均匀。
(1)对于每个序列,比较第一个元素、中间元素和最后一个元素的值,取值居中的一个数作为基准值,将第一个数与值居中的这个数交换位置。
代码实现:
(2)对于每个序列,随机选取从头到尾的一个随机数作为基准值,这种排序叫做随机快速排序。
- 归并排序:二路归并
- 归并排序--二路归并
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序
- Java堆栈笔记
- 查看linux系统常用的命令,Linux查看系统配置常用命令
- 备忘录:listview底部分割线问题
- linux iotop命令
- java基础 ------泛型
- 二路归并排序
- 字符串中间追加逗号(末尾没有逗号)
- Keras学习之四:用RNN进行评论好恶预测
- Visual Studio中,MSBUild版本问题
- 静态导入与增强for循环
- QT背景设置
- 获取项目系统路径
- Swift基础之封装蒙版指导视图
- 【nginx-rtmp】03、常见问题(FAQ)