tag:分治、排序


快速排序的通俗解释


1.从数组中选出一个元素xxx(可以随意选取)

2.把所有<=x<=x<=x的元素放在x前面(形成一个子区间),所有>=x>=x>=x大的元素放在xxx后面(形成另一个子区间)

3.使用递归的方法,对“2”中形成的两个子区间重复执行操作,最终可以得到一个排好序的数组

换句话说,快速排序就是递归的做这样一个事情:把一个区间划分为两个子区间,左区间全都<=<=<=标记数xxx,右区间全都>=>=>=标记数xxx。经过递归调用自身函数,最终得到排序好的数组。

通过下面的gif动图,可以更加形象的理解:

关于快排的递归问题及其分析,可以参考这篇博客:
对快速排序进行尾递归优化

void quick_sort(int q[], int l, int r)
{if (l >= r)return;//区间里面只有一个数或者没有数int x = q[(l + r) / 2], i = l - 1, j = r + 1;//选择中间数作为标记数while (i < j)//执行一次while语句,可以使一个区间划分为两个区间{do i++;while (q[i] < x);do j--;while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j);quick_sort(q,j+1,r);
}

对上述图示与代码的解释与模拟

假设有这样一个数组q

q=[5,4,3,1];

选取中间数4作为分割区间的标记数,在初始时,i,j对应的下标分别是-1和4,如下图所示:

经过一次do while语句之后,i,j分别对应0和3,指向数组第一个和最后一个元素。

为了使前一个区间全都小于标记值4,后一个区间全都大于标记值4,我们使i++,直到i对应的值大于或等于标记值4;使j–,直到j对应的值小于或等于值4,之后进行元素值的交换(swap语句)。

通过这一次while循环,可以使得原先数组的前一半部分全部小于或等于标记值4,后一部分全都大于或等于标记值4。

while (i < j)//每经过一次while循环{do i++;while (q[i] < x);do j--;while (q[j] > x);if (i < j) swap(q[i], q[j]);}

把5和1进行交换:

交换之后得到:

此时i = 0,j = 3,满足i < j,进入下一次while循环:

我们发现此时i指向4,j指向3,交换值,可以得到:

最终经过一次while循环,我们得到了基于标记值4的数组分割:即前面的数字都<=<=<= 4,后面的数字都 >=>=>= 4

最后递归的对这两个小区间进行快速排序,即:

quick_sort(q, l, j);
quick_sort(q,j+1,r);

算法复杂度分析

平均时间复杂度:O(nlog⁡n)O(n\log n)O(nlogn)

每进行一次【划分区间】操作,会递归调用处理一半大小的数列。因此,在递归结束前,我们要作O(log⁡n)O(\log n)O(logn)次嵌套的调用,即调用树的深度是O(log⁡n)O(\log n)O(logn)。程序调用的每一层次结构总共全部仅需要O(n)O(n)O(n)的时间。结果是这个算法仅需使用O(nlog⁡n)O(n\log n)O(nlogn)时间。

最差时间复杂度:O(n2)O(n^{2})O(n2)

当数组已经排好序的情况下,快速排序退化为冒泡排序。

每一个区间划分成的两子区间分别含有111 和n−1n-1n−1个元素。第iii 次调用作了O(n−i)O(n-i)O(n−i)的工作量,且
∑i=0n(n−i)=O(n2)\sum _{i=0}^{n}(n-i)=O(n^{2}) i=0∑n​(n−i)=O(n2)
递归关系式为:
T(n)=O(n)+T(1)+T(n−1)=O(n)+T(n−1)T(n)=O(n)+T(1)+T(n-1)=O(n)+T(n-1) T(n)=O(n)+T(1)+T(n−1)=O(n)+T(n−1)

这与插入排序与选择排序有相同的关系式,上式被解为T(n)=O(n2)T(n)=O(n^{2})T(n)=O(n2)。

c++代码

#include <vector>
#include<iostream>
#include<algorithm>using namespace std;const int N = 100010;int n;
int q[N];void quick_sort(int q[], int l, int r)
{if (l >= r)return;//区间里面只有一个数或者没有数int x = q[(l + r) / 2], i = l - 1, j = r + 1;while (i < j)//每经过一次while循环{do i++;while (q[i] < x);do j--;while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j);quick_sort(q,j+1,r);
}int main()
{cin >> n;for (int i = 0; i < n;i++)cin >> q[i];quick_sort(q, 0, n - 1);for (int i = 0;i < n;i++)cout << q[i]<<" ";return 0;
}

运行截图

三分钟学会快速排序(图示讲解,附代码,通俗易懂)相关推荐

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

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

  2. Juniper 210 密码清不掉_三分钟学会如何找回mysql密码

    一.在测试工作中我们肯定会写一些sq查询语句方便我们验证数据是否正确,从而判断当前软件是否存在缺陷,但是查询的过程中肯定需要我们先连接数据库,如果数据库密码忘记我们就无法完成工作,这里就教会大家如何快 ...

  3. 三分钟学会PS小清新调色教程-萧蕊冰

    今天的PS小教程教你三分钟学会PS小清新调色教程.夏天到了,夏天的阳光很大,拍出的照片都会有一种暖色的感觉,那么我们怎么把一张照片调成日式小清新呢?今天我们就来学一个PS小清新调色教程,让你体验一下日 ...

  4. Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例)

    Java对象,Map,List,Set数组等相互转换大全(详细讲解,附代码,讲解案例) Java对象 转 JSON字符串 JAVA对象转MAP Map转java对象 List转map List和Map ...

  5. python爬虫源码附注解_Python小白写的三个入门级的爬虫(附代码和注释)

    Python小白写的三个入门级的爬虫(附注释) 写在前面的话:作者目前正在学习Python,还是一名小白,所以注释可以会有些不准确的地方,望谅解. 这三个小爬虫不是很难,而且用处可能也不大,主要还是锻 ...

  6. WORD如何设置打印? 三分钟学会WORD打印技巧

    我们在办公的时候,很多人时常会需要打印各种各样的文件,很多人都只知道,去打印当前页,或者是整个文档,但在Word打印中也有很多不同的技巧,那么Word如何设置打印?今天呢就来给大家分享一下Word打印 ...

  7. 快速排序算法讲解及代码(详细)

    快速排序算法 一.序言 二.快速排序基本思想 三.具体步骤 四.具体代码 一.序言 快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序.所以我们也有必要了解快排的原理以 ...

  8. 【ROM制作工具】如何三分钟学会制作手机线刷包?一键制作线刷包详细教程

    如何在最短的时间内制作一款手机线刷包让卡顿的手机线刷回官方?线刷回官方的手机刷机包在制作时有什么样的技巧?接下来将和大家分享一下如何在三分钟制作一款手机线刷包! 一键制作线刷包详细教程 准备工作: 首 ...

  9. 三分钟学会 H5 聊天机器人开发(附源码和在线演示)

    [学习目标] 熟悉和掌握 HTML结构和CSS的相关知识 学会使用HBuilder进行APP打包 熟悉JavaScript的基本用法和jQuery的使用(提前预习) HBuilder 它是一个快速开发 ...

最新文章

  1. SOA:惠普也要分块蛋糕
  2. 应用程序框架实战三十六:CRUD实战演练介绍
  3. android studio 运行 Java Application
  4. jqGrid使用经验分享(一)——jqGrid简单使用、json格式和jsonReader介绍
  5. php 自带缓存,封装ThinkPhP自带的缓存机制
  6. [delphi]修改indy源码后重新编译
  7. javaweb系统oracle锁表,oracle、websphere下获取数据库连接时出现死锁
  8. 港铁将更换信号系统 或影响日间列车服务冀乘客谅解
  9. 单链表的基础操作练习
  10. Git学习(一)本地操作
  11. unity lookat导致物体颠倒怎么解决_Unity草地交互的实现
  12. 系列文章--WF学习资料汇总
  13. ESP8266开发之旅 应用篇② OLED显示天气屏
  14. SQL2014 MySQL_SQL Server 2014 Express 官方免费版下载
  15. 更换app图标和名称
  16. 聚观早报 | 范红卫登顶中国女首富;4个县级市获明确为大城市
  17. 努比亚(nubia) Z18 mini NX611J 解锁BootLoader 并刷入recovery ROOT
  18. 2021:医学视觉问答的多元模型量化Multiple Meta-modal Quantifying for Medical Visual Question Answering
  19. 如何设置电脑的保护色?
  20. python游戏开发keydown_pygame.KEYDOWN移动对象

热门文章

  1. 采集服务器维护,采集服务器
  2. 反光衣穿戴识别检测系统 OpenCV
  3. Android P HAL层添加HIDL实例(详细实现步骤)
  4. 5g的八大关键指标_2019互联网八大热门话题:总有一个击中你的表达欲
  5. 75%医用输液泵受漏洞威胁 360专家呼吁构建数字安全防御体系
  6. C语言画奥运五环以及五角星
  7. java学习第12天
  8. MNI坐标,world坐标和矩阵坐标互相转换
  9. 猛犸Winform分页控件
  10. BIOS模式怎么退出