几分钟学会归并排序和快速排序
文章目录
- 前言
- 归并排序
- 快速排序
- 最后
前言
先来看看这两个排序在常见的排序中的速度比较(50个随机数):
再来看看数据放大四倍后(200个随机数)的速度:
可见这两种排序在大部分的排序算法中脱颖而出,数据量较少的时候,快速排序比归并排序要快,数据量变大后,快排略逊一筹。是不是真的呢?让我们来一起学习康康。
(区别于文章末尾的测试)
(截图源自手机APP:C语言学习宝典)
归并排序
(截图源自百度百科)
归并:顾名思义是把数据合并,在这之前需要把他们分开,这是“分”的过程,合并的过程就是“治”的过程。
<画个草图>
分:奇数序列我习惯给右边的序列多分一个数(看网上很多是左边多分一个数,但我调试的时候由于边界问题出bug了就给改了)
治:处理两个有序列的算法可参考 : 力扣第21题“合并两个有序链表”
用到了类似哑元加迭代的思想,迭代放在两个有序列起点位置的下标,每次比较下标位置元素大小,按比较条件放入新建立的数组。
下面是代码部分:
class myMergesort {public:vector<int> Mergesort(vector<int>& before) {if (before.size() == 1)return before; /*递归出口*/vector<int>left, right, ans; /*分*/for (int i = 0; i < before.size() / 2; ++i) /*左切块*/left.push_back(before[i]);for (int i = before.size() / 2; i < before.size(); ++i)/*右切块*/right.push_back(before[i]);left=Mergesort(left);/*继续切左边(递归)*/right=Mergesort(right);/*继续切右边(递归)*//*治*/int i=0, j=0;while(i<left.size()&&j<right.size()) {/*排序插入到ans*/if (left[i] <= right[j])ans.push_back(left[i++]);else ans.push_back(right[j++]);}if (i == left.size()) /*接上right的后续有序列*/for (int k = j; k < right.size(); ++k)ans.push_back(right[k]);if (j == right.size())/*接上left的后续有序列*/for (int k = i; k < left.size(); ++k)ans.push_back(left[k]);return ans;}
};
调试过程
50个(0~9)随机数:
20000个(0~9)随机数:
快速排序
快排:C/C++可直接使用快速排序的库函数qsort() / sort()
快排也用到了分治的思想,但它的“分”的过程是依据基准数归位后所在的位置进行划分,而基准数是什么?怎么“治”?才是快排的关键。
基准数:通俗讲就是每次需要归位的数,每次归位后,它的左边都是比它小的数,它的右边都是比它大的数。(一般取最左边的数为基准数)
治:(这里引用到的是《啊哈!算法》中的小插图)
首先左右哨兵站在序列的左右两端(下标定位,基准数为6):
<右边的哨兵先往左走,找到第一个比6小的数停下>
<左边的哨兵再往右走,找到第一个比6大的数停下>
<然后把他们交换>
哨兵继续走,重复上述过程(交换9和4):
当他们相遇,将相遇处的数字3和基准数6交换:
这就完成了一次“治”的过程,然后将此时左边和右边的序列进行递归,最后返回完成排序。
主代码部分:
void myQuicksort::_myQuicksort(int left,int right) {if (left >= right)return;int i = left,j=right,base=ans[left],temp;while (i<j) {while (ans[j] >= base && j > i)--j; /*1.右哨兵定位*/while (ans[i] <= base && i < j)++i; /*1.左哨兵定位*/if (i < j) { /*若左右哨兵相遇,取消定位处的交换*//*2.交换左右哨兵定位到的元素*/temp = ans[j];ans[j] = ans[i];ans[i] = temp;}}/*3.交换基准数和哨兵相遇处的元素*/ans[left] = ans[i];ans[i] = base;_myQuicksort(left,i-1);/*左边的无序序列继续调用快排*/_myQuicksort(i+1,right);/*右边的无序序列继续调用快排*/
}
调试过程:
50个(0~9)随机数:
20000个(0~9)随机数:
对比一下,什么?!快排比归并排序要快!直接打脸了,为什么在app里的结果不一样呢…
最后
文章总结了快排和归并的原理以及用法,等我以后哪天忘了就来看看。
大家不要复制粘贴,要认真学习总结,不懂的给我留言,哈哈哈还押韵上了,小生不才不当的地方请多多指教。
参考:《啊哈!算法》中的排序一章 还有 百度百科。
几分钟学会归并排序和快速排序相关推荐
- 排序算法中——归并排序和快速排序
冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...
- UWP开发入门(十九)——10分钟学会在VS2015中使用Git
原文:UWP开发入门(十九)--10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支 ...
- 三分钟学会css3中的flexbox布局
2019独角兽企业重金招聘Python工程师标准>>> 这篇文章里我们将学习CSS里flexbox布局的几个最重要的概念,通过学习flexbox布局,你会发现以往遇到的所有的关于布局 ...
- h5 img js 点击图片放大_5分钟学会h5生成图片海报!
生成海报这个功能很实用,之前我们学过小程序生成海报的方法,今天我们来学h5生成海报. 基本原理:其实就是把你html+css写的样式转换成图片下载. 如何实现的 首先我们需要引入下面两个js插件 原理 ...
- python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...
原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...
- python代码写好了怎么运行并画图-无所不能的python编程是怎么快速画图的呢?5分钟学会!...
原标题:无所不能的python编程是怎么快速画图的呢?5分钟学会! Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言 ...
- 函数式编程语言python-10分钟学会python函数式编程
原标题:10分钟学会python函数式编程 在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程.你也将了解列表推导和其它形式的推导. 函数范式 在命令式范式中,通过为计算机提供 ...
- python画图程序-无所不能的python编程是怎么快速画图的呢?5分钟学会!
原标题:无所不能的python编程是怎么快速画图的呢?5分钟学会! Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言 ...
- 5分钟学会开发浏览器扩展
写在前面 做web开发的同学,经常会用到各种chrome浏览器插件,那么我们寄几怎么开发一个插件呢(其实是浏览器扩展)?其实很简单,你意想不到的简单.只要有web开发基础,会写基本的html,css和 ...
最新文章
- Spring注解之 @EnableScheduling计划任务注解
- linux小脚本批量添加/删除用户
- knx智能照明控制系统电路图_咻享智能|智能家居照明控制系统的功能特点
- 大数据 java 代码示例_Java变量类型与示例
- npm安装typescript
- 吴恩达机器学习作业5.偏差和方差
- 第 12 章 多路查找树
- html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表
- 中南大学 09 MATLAB 矩阵的处理
- vue2.0配置 https://github.com/wike933/vuebook
- 软件开发文档编写规范
- adams齿轮齿条怎么定义接触,直齿轮adams接触(碰撞)仿真分析
- 百度wz竞价推广关键词排名的影响因素大全
- 《Head First Java》| 1 进入Java 的世界
- 加工制造业经销商渠道管理系统:共享上下游信息,加速交易效率
- VB定义字符串数组并赋值
- VMware虚拟机关闭U盘USB自动识别
- RRStudio(一)
- openjudge 1.6.2 陶陶摘苹果
- 个人承接微信H5制作设计,需要的联系我
热门文章
- 虚拟内存越大越好吗_二次构造柱泵的功率越大越好吗—自然不是
- 我的所想——短暂的北漂
- SAP Spartacus cxFocus增添了refresh Focus功能后的一些考虑
- SAP Spartacus的pagination$ -默认的分页设置10
- SAP Spartacus app module注入config module的过程
- SAP Spartacus CurrentProductService返回的null对象
- 使用SAP Cloud for Customer Product OData服务读取产品主数据和其图片信息
- SAP CRM WebClient UI cross component跳转的一个具体例子
- SAP S4HANA custom logic的一个实际例子
- how is table select_all_icon being loaded