一、前言

快速排序是一种交换排序,它由C. A. R. Hoare在1962年提出。

二、算法思想

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。

然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

动态效果示意图:

详细的图解往往比大堆的文字更有说明力,所以直接上图:

上图中,演示了快速排序的处理过程:

初始状态为一组无序的数组:2、4、5、1、3。

经过以上操作步骤后,完成了第一次的排序,得到新的数组:1、2、5、4、3。

新的数组中,以2为分割点,左边都是比2小的数,右边都是比2大的数。

因为2已经在数组中找到了合适的位置,所以不用再动。

2左边的数组只有一个元素1,所以显然不用再排序,位置也被确定。(注:这种情况时,left指针和right指针显然是重合的。因此在代码中,我们可以通过设置判定条件left必须小于right,如果不满足,则不用排序了)。

而对于2右边的数组5、4、3,设置left指向5,right指向3,开始继续重复图中的一、二、三、四步骤,对新的数组进行排序。

1、代码

C++:

#include <iostream>
#include <vector>using namespace std;int division(vector<int> &list, int left, int right){// 以最左边的数(left)为基准int base = list[left];while (left < right) {// 从序列右端开始,向左遍历,直到找到小于base的数while (left < right && list[right] >= base)right--;// 找到了比base小的元素,将这个元素放到最左边的位置list[left] = list[right];// 从序列左端开始,向右遍历,直到找到大于base的数while (left < right && list[left] <= base)left++;// 找到了比base大的元素,将这个元素放到最右边的位置list[right] = list[left];}// 最后将base放到left位置。此时,left位置的左侧数值应该都比left小;// 而left位置的右侧数值应该都比left大。list[left] = base;return left;
}// 快速排序
void QuickSort(vector<int> &list, int left, int right){// 左下标一定小于右下标,否则就越界了if (left < right) {// 对数组进行分割,取出下次分割的基准标号int base = division(list, left, right);// 对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序QuickSort(list, left, base - 1);// 对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序QuickSort(list, base + 1, right);}
}void main(){int arr[] = { 6, 4, 8, 9, 2, 3, 1 };vector<int> test(arr, arr + sizeof(arr) / sizeof(arr[0]));cout << "排序前" << endl;for (int i = 0; i < test.size(); i++){cout << test[i] << " ";}cout << endl;vector<int> result = test;QuickSort(result, 0, result.size() - 1);cout << "排序后" << endl;for (int i = 0; i < result.size(); i++){cout << result[i] << " ";}cout << endl;system("pause");
}

运行结果:

Python:

# -*- coding:utf-8 -*-def QuickSort(input_list, left, right):'''函数说明:快速排序(升序)Author:www.cuijiahua.comParameters:input_list - 待排序列表Returns:无'''   def division(input_list, left, right):'''函数说明:根据left和right进行一次扫描,重新找到基准数Author:www.cuijiahua.comParameters:input_list - 待排序列表left - 左指针位置right - 右指针位置Returns:left - 新的基准数位置'''    base = input_list[left]while left < right:while left < right and input_list[right] >= base:right -= 1input_list[left] = input_list[right]while left < right and input_list[left] <= base:left += 1input_list[right] = input_list[left]input_list[left] = basereturn leftif left < right:base_index = division(input_list, left, right)QuickSort(input_list, left, base_index - 1)QuickSort(input_list, base_index + 1, right)if __name__ == '__main__':input_list = [6, 4, 8, 9, 2, 3, 1]print('排序前:', input_list)QuickSort(input_list, 0, len(input_list) - 1)print('排序后:', input_list)

运行结果同上。

三、算法分析

1、快速排序算法的性能

2、时间复杂度

当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。

而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。

所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。

3、时间复杂度

快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 logN次的分割处理,所以占用空间也是 logN 个。

4、算法稳定性

在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。

最后再送大家一本,帮助我拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是一位 Google 大神写的,对于算法薄弱或者需要提高的同学都十分受用:

谷歌和阿里大佬的Leetcode刷题笔记

以及我整理的 BAT 算法工程师学习路线,书籍+视频,完整的学习路线和说明,对于想成为算法工程师的,绝对能有所帮助(提取码:jack):

我是如何成为算法工程师的,超详细的学习路线

更多精彩,请看这里:

悄悄拔节,惊艳所有~

朴实无华,图解快排,多语言实现。(PS:还有宝藏资料)相关推荐

  1. c语言 快排,C语言 快排函数

    C语言中有快排的函数,可以直接使用,见下面调用格式: qsort包含在头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序.排序之后的结果仍然放在原数组中.使用qsort函数必须自己写 ...

  2. 快排 c语言,c语言的库函数之快排

    之前都是手写的快排 但是毕竟写太多快排了 是时候用一波他自己自带的快排了说实话要不是之前用了一次 stl 感觉封装好了的东西实在是太好用了 不禁又回想起当初用python 写的复杂的数据结构 简直不要 ...

  3. c语言快排过程,快速排序(快排)C语言实现

    快速排序 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:经过一趟排序将要排序的数据分割成独立的两部分,其中一部分的全部数据都比另一部分的全部数据都要小,而后再按此方法对这两部 ...

  4. 快排C语言三种实现方法(大同小异)

    快速排序C语言版(附带视频讲解) 注:3种快排的名字是我自己取的,并非专业名称 方法一(最常用的方法):左端抽轴(pivot)法 思路 && 操作: 排序准备:取左边第一位数为pivo ...

  5. c语言程序快排,C语言快排

    C语言使用快排的方式有两种,1.直接用库函数stdlib.h里的qsort函数 2.自己编写快排代码(第一种方便,第二种较为自由) qsort 的函数原型是: void qsort(void*base ...

  6. 图解快排——快速排序算法(quick sort)

    快速排序 quick sort 算法思想 算法图解 算法实现(C语言) 性能分析 算法思想 快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一 ...

  7. c语言寻找大富翁,PTA 7-38 寻找大富翁(25 分)解法(C/C++)暴力快排/精准堆排 解法...

    7-38 寻找大富翁 (25分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式: 输入首 ...

  8. 【黑帽大牛】浅谈SEO快排系统对网站排名优化真的有帮助吗?【精品】

    大家好,今天我们要跟大家探讨的问题是"[黑帽大牛]浅谈SEO快排系统对网站排名优化真的有帮助吗?".以下案例参考战神快排系统. 之前有太多的人私聊我:汉文黑帽大牛,我想问一下现在百 ...

  9. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

最新文章

  1. [Voice communications] 看得到的音频流
  2. 历经8年双11流量洗礼,淘宝开放平台如何攻克技术难关?--转
  3. c++ 编译添加dll_VS2019编译lua源码
  4. download first at netease music
  5. 解决IOS ATS禁止HTTP明文传输
  6. React学习(8)—— 高阶应用:不使用ES6、JSX实现React
  7. linux查看磁盘io性能
  8. 数据挖掘技术之离群点检测
  9. Script.NET 1.0版本的Tcl+Html界面编程原理
  10. 石头购房经验谈(下)
  11. 2-2 Aruba控制器 无线漫游优化 2020
  12. java date 年龄_Java 根据年月日精确计算年龄
  13. vue图片超出屏幕尺寸自动适应图片比例缩放
  14. dede taglist模板中调用自定义字段
  15. 回溯算法 允许重复选择元素的组合
  16. cvs配电保护断路器_施耐德漏电断路器 CVS+vigi系列四级漏电断路器
  17. getElementsByClassName用法
  18. 中小型企业创业的福音
  19. C++的沉迷与爱恋 from 侯捷
  20. 如何使用Echarts创建动态K线图

热门文章

  1. 怎么设置苹果手机的小圆点_苹果屏幕旋转怎么设置?关于苹果手机设置的一些小技巧...
  2. hdu4433 locker
  3. Goolge Driver 聯動 Co-Lab Notebook
  4. CAD教程:CAD建筑户型图纸还能这么画?
  5. PostgreSQL之Sequence序列(转)
  6. 打开autoCAD2004出现fail to get commcntrcontroller错误信息
  7. SSH 登陆虚拟机VBox
  8. 分组聚合显示全部列_Power BI经典技巧:动态显示数据层级
  9. Android中使用Camera类编写手机拍照App的实例教程
  10. GTA IV免DVD破解补丁无法运行的解决办法