文章目录

  • 前言
    • 归并排序
    • 快速排序
  • 最后

前言

先来看看这两个排序在常见的排序中的速度比较(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里的结果不一样呢…


最后

文章总结了快排和归并的原理以及用法,等我以后哪天忘了就来看看。

大家不要复制粘贴,要认真学习总结,不懂的给我留言,哈哈哈还押韵上了,小生不才不当的地方请多多指教。

参考:《啊哈!算法》中的排序一章 还有 百度百科。

几分钟学会归并排序和快速排序相关推荐

  1. 排序算法中——归并排序和快速排序

    冒泡排序.插入排序.选择排序这三种算法的时间复杂度都为 $O(n^2)$,只适合小规模的数据.今天,我们来认识两种时间复杂度为 $O(nlogn)$ 的排序算法--归并排序(Merge Sort)和快 ...

  2. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    原文:UWP开发入门(十九)--10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支 ...

  3. 三分钟学会css3中的flexbox布局

    2019独角兽企业重金招聘Python工程师标准>>> 这篇文章里我们将学习CSS里flexbox布局的几个最重要的概念,通过学习flexbox布局,你会发现以往遇到的所有的关于布局 ...

  4. h5 img js 点击图片放大_5分钟学会h5生成图片海报!

    生成海报这个功能很实用,之前我们学过小程序生成海报的方法,今天我们来学h5生成海报. 基本原理:其实就是把你html+css写的样式转换成图片下载. 如何实现的 首先我们需要引入下面两个js插件 原理 ...

  5. python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...

    原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...

  6. python代码写好了怎么运行并画图-无所不能的python编程是怎么快速画图的呢?5分钟学会!...

    原标题:无所不能的python编程是怎么快速画图的呢?5分钟学会! Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言 ...

  7. 函数式编程语言python-10分钟学会python函数式编程

    原标题:10分钟学会python函数式编程 在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程.你也将了解列表推导和其它形式的推导. 函数范式 在命令式范式中,通过为计算机提供 ...

  8. python画图程序-无所不能的python编程是怎么快速画图的呢?5分钟学会!

    原标题:无所不能的python编程是怎么快速画图的呢?5分钟学会! Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言 ...

  9. 5分钟学会开发浏览器扩展

    写在前面 做web开发的同学,经常会用到各种chrome浏览器插件,那么我们寄几怎么开发一个插件呢(其实是浏览器扩展)?其实很简单,你意想不到的简单.只要有web开发基础,会写基本的html,css和 ...

最新文章

  1. Spring注解之 @EnableScheduling计划任务注解
  2. linux小脚本批量添加/删除用户
  3. knx智能照明控制系统电路图_咻享智能|智能家居照明控制系统的功能特点
  4. 大数据 java 代码示例_Java变量类型与示例
  5. npm安装typescript
  6. 吴恩达机器学习作业5.偏差和方差
  7. 第 12 章 多路查找树
  8. html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表
  9. 中南大学 09 MATLAB 矩阵的处理
  10. vue2.0配置 https://github.com/wike933/vuebook
  11. 软件开发文档编写规范
  12. adams齿轮齿条怎么定义接触,直齿轮adams接触(碰撞)仿真分析
  13. 百度wz竞价推广关键词排名的影响因素大全
  14. 《Head First Java》| 1 进入Java 的世界
  15. 加工制造业经销商渠道管理系统:共享上下游信息,加速交易效率
  16. VB定义字符串数组并赋值
  17. VMware虚拟机关闭U盘USB自动识别
  18. RRStudio(一)
  19. openjudge 1.6.2 陶陶摘苹果
  20. 个人承接微信H5制作设计,需要的联系我

热门文章

  1. 虚拟内存越大越好吗_二次构造柱泵的功率越大越好吗—自然不是
  2. 我的所想——短暂的北漂
  3. SAP Spartacus cxFocus增添了refresh Focus功能后的一些考虑
  4. SAP Spartacus的pagination$ -默认的分页设置10
  5. SAP Spartacus app module注入config module的过程
  6. SAP Spartacus CurrentProductService返回的null对象
  7. 使用SAP Cloud for Customer Product OData服务读取产品主数据和其图片信息
  8. SAP CRM WebClient UI cross component跳转的一个具体例子
  9. SAP S4HANA custom logic的一个实际例子
  10. how is table select_all_icon being loaded