快速排序的思想是,以某个元素为基准(一般取第一个元素),将其余数分为两部分,一部分比基准的值小,另一部分比基准的值大,然后在这两部分中通过与新的基准值作比较,分为四部分,再分为八部分,以次类推直到排序结束。这其中蕴含了递归与分治的思想。例如:

对数列 49 38 65 97 13 27 55 04进行快速排序,取第一个数49为基准将其余数分为两部分

04 38 27 13 49 97 55 65   再以49为中心分为两部分,左边以04为基准,右边以97为基准进行划分

04 38 27 13 49 65 55 97   类似的,38 27 13 以38为基准,65 55 以65为基准进行划分

04 13 27 38 49 55 65 97   13 27 以13为基准进行划分,55一个数不满足函数执行条件,不用划分

04 13 27 38 49 55 65 97    只剩27一个数了,不做任何改变,算法执行结束。最终结果为

04 13 27 38 49 55 65 97

快速排序每一次以某个基准划分时,都会将该基准数放置于它应该所在的最终位置上。


快速排序时间复杂度为o(nlogn),空间复杂度为o(logn)(程序执行中栈的深度)。当数列基本处于正序或逆序时,快速排序的时间复杂度和空间复杂度会增大,分别会达到o()和o(n)。


快速排序我本人之前经常写成如下这样:

  int partion(int* arr, int low, int high){int temp = arr[low];//保存基准值int i = low, j = high;while (i < j){while (i<j&&arr[j]>temp)//先从后面开始比较j--;if (i < j)arr[i] = arr[j];while (i<j&&arr[i] < temp)i++;if (i < j)arr[j] = arr[i];}arr[i] = temp;//写成arr[j]=temp也可以,i是等于j的return i;}

写这篇文章时,我发现这种写法的缺点在于有可能会导致程序会陷入无限循环,例如对于 49 49 50进行排序,它会不停将49与49进行交换,直至天荒地老。

所以更正如下:

arr[i++] = arr[j];arr[j--] = arr[i];

快速排序是一种不稳定的排序方法。

当采用arr[j]>temp,arr[i]<temp时,对于49 49 50 来讲,排序结果为49 49 50 ,不稳定;

采用arr[j]>=temp,arr[i]<=temp时,对于 49 38 49 04来讲,排序结果为 04 38 49 49,仍然是不稳定的。


快速排序完整代码如下:

  #include<iostream>#define N 20void qSort(int* arr, int low,int high);int partion(int* arr, int low, int high);//返回基准值所处的位置,方便递归调用int main(){int a[N] = { 3, 2, 4, 6, 7, 5, 18, 9, 0, 1,16, 8, 20, 33, 28, 64, 19, 31, 30, 25 };for (int i = 0; i < N; i++){std::cout << a[i] << "  ";}std::cout << '\n'; qSort(a, 0,N-1);for (int i = 0; i < N; i++){std::cout << a[i] << "  ";}std::cout << '\n';return 0;}void qSort(int* arr, int low,int high){if (low<high){int a = partion(arr, low, high);qSort(arr, low, a - 1);//递归调用qSort(arr, a + 1, high);//递归调用}}int partion(int* arr, int low, int high){int temp = arr[low];//保存基准值while (low < high){while (low < high&&arr[high]>temp)//先从后面开始比较high--;if (low < high)//最好不要省略,足以保证在while执行完之后i定是等于j的arr[low++] = arr[high];while (low<high&&arr[low] < temp)low++;if (low < high)arr[high--] = arr[low];}arr[low] = temp;//写成arr[high]=temp也可以,low是等于high的return low;}

交换排序之——快速排序(c/c++)相关推荐

  1. 数据结构之交换排序:快速排序

    交换排序:快速排序 快速排序的算法原理: 快速排序的代码实现: 快速排序的性能分析: 快速排序的算法原理: pivot前面的元素都比它小,后面的元素都比它大 快速排序的代码实现: //返回最终元素划分 ...

  2. ※交换排序(1)——快速排序(quick sort)

    快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列.步骤为: 从序列中挑出一个元素,作为"基准"(pivot). 把所有比基准值小的元素放在基准 ...

  3. 【算法之家】——交换排序之冒泡排序与快速排序

    [前言] 冒泡排序和快速排序属于交换排序,快速排序是冒泡排序的一种改进算法.我更觉得快速排序更像是一种特殊的二分查找,从两头开始查找,用法更加的巧妙! [内容] 冒泡排序的基本过程用如下的动态图表示: ...

  4. 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  5. 数据结构和算法系列5 七大排序之冒泡排序和快速排序

    排序是我们生活中经常会面对的问题.同学们做操时会按照从矮到高排列:老师查看上课出勤情况时,会按学生学号顺序点名:高考录取时,会按成绩总分降序依次录取等.排序是数据处理中经常使用的一种重要的运算,它在我 ...

  6. 内排序及时间复杂度分析-插入排序选择排序交换排序归并排序分配和索引排序对比...

    基本概念 什么是排序? 排序 将序列中的记录按照排序码顺序排列起来 排序码域的值具有不减(或不增)的顺序 内排序 整个排序过程在内存中完成 给定一个序列 R = { r1, r2, ...,rn } ...

  7. 交换排序 java_java实现交换排序

    交换排序是另一种经常使用的内部排序策略,常见的算法有冒泡排序和快速排序,之所以把冒泡排序和快速排序归类为交换排序,是因为这两种算法的主要工作是不断的交换元素来达到排序的目的. 冒泡排序是最经典的交换排 ...

  8. 选择排序 插入排序 交换排序

    动图演示: https://www.runoob.com/w3cnote/bubble-sort.html 选择排序 简单选择排序 在未排序的序列中,选出最小的元素和序列的首位元素交换,接下来在剩下的 ...

  9. c++ list排序_排序(二)交换排序

    介绍两种交换排序:冒泡和交换 冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是 ...

最新文章

  1. python输入两个数用逗号隔开如不是两个数报错_Python数据类型
  2. hdu 1853(Cyclic Tour)
  3. git fetch和git pull之间的区别--转载
  4. 小程序完整对接 pingpp支付
  5. 兼容所有浏览器的CSS3圆角效果
  6. Shell中I/O重定向的用法笔记
  7. java反射的field.get(null)
  8. c语言main函数的参数argc,argv说明
  9. java中 若干,Java中的随机数发生器。产生若干的复杂性
  10. 一个求矩阵鞍点(即行上最小的数 同时是列上最大的数)的C程序
  11. extjs 右下角弹出消息框
  12. N元语言模型的解码算法
  13. 白天工作效率低,晚上效率高怎么调整过来?
  14. 尚硅谷-Promise
  15. 区块链51%双花攻击
  16. desmos绘制心形图案
  17. pytorch中DataLoader的num_workers
  18. 怎样将几个pdf文件合成一个?
  19. 保利紫山开启湛江城市墅居新纪元
  20. ORB-SLAM2原理分析

热门文章

  1. Zxing 竖屏切换 android
  2. javascript对象的几种创建方式
  3. Javascript的作用域,作用域链,闭包
  4. centos7安装php5.6版本
  5. Ubuntu+Apache+PHP+Mysql环境搭建
  6. 使用U盘在Mac机上装win8.1系统
  7. Static与函数指针 转
  8. TFS数据库变成可疑状态的处理
  9. 不得不爱开源 Wijmo jQuery 插件集(4)-【手风琴效果】(附页面展示和源码)
  10. 设计模式复习-外观模式