快速排序(Quick Sort)使用分治法策略
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序流程:
(1) 从数列中挑出一个基准值。
(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
(3) 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。

快速排序稳定性
快速排序是不稳定的算法,它不满足稳定算法的定义。
算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

快速排序时间复杂度
快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。
这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。
(01) 为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。
(02) 为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。

/*** 快速排序:C++** @author skywang* @date 2014/03/11*/#include <iostream>
using namespace std;/** 快速排序** 参数说明:*     a -- 待排序的数组*     l -- 数组的左边界(例如,从起始位置开始排序,则l=0)*     r -- 数组的右边界(例如,排序截至到数组末尾,则r=a.length-1)*/
void quickSort(int* a, int l, int r)
{if (l < r){int i,j,x;i = l;j = r;x = a[i];while (i < j){while(i < j && a[j] > x)j--; // 从右向左找第一个小于x的数if(i < j)a[i++] = a[j];while(i < j && a[i] < x)i++; // 从左向右找第一个大于x的数if(i < j)a[j--] = a[i];}a[i] = x;quickSort(a, l, i-1); /* 递归调用 */quickSort(a, i+1, r); /* 递归调用 */}
}int main()
{int i;int a[] = {30,40,60,10,20,50};int ilen = (sizeof(a)) / (sizeof(a[0]));cout << "before sort:";for (i=0; i<ilen; i++)cout << a[i] << " ";cout << endl;quickSort(a, 0, ilen-1);cout << "after  sort:";for (i=0; i<ilen; i++)cout << a[i] << " ";cout << endl;return 0;
}

算法:快速排序稳定性相关推荐

  1. 排序算法 | 快速排序,算法的图解、实现、复杂度和稳定性分析与优化

    今天讲解一下快速排序算法的原理以及实现.复杂度和稳定性分析与优化 目录 1 快速排序的原理 2 快速排序代码实现 3 复杂度和稳定性分析.优化 4 习题练习 1 快速排序的原理 快速排序是所有内部排序 ...

  2. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  3. 数据结构与算法:排序算法的稳定性以及各性能比较python实现

    招聘笔试中经常会考到排序算法,在此做一个总结. 一.算法概念 1.排序算法的稳定性 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[ ...

  4. 数据结构中各种排序算法的稳定性比较

    1.简单选择排序 2.堆排序        (1和2是属于选择排序) 3.直接插入排序 4.希尔排序     (3和4属于插入排序,有时把改进后的直接插入排序叫做二分插入) 5.冒泡排序        ...

  5. 选择排序总结以及排序算法的稳定性

    选择排序介绍: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始(末尾)位置,直到全部待排序的数 ...

  6. 什么是排序算法的稳定性?

    什么是排序算法的稳定性? 今天来了解一下排序算法的稳定性的定义和一些常见排序算法的稳定性,一起来看看吧! 我们知道排序算法有时间.空间复杂度,那稳定性是什么意思呢?和它们有关吗? 文章目录 什么是排序 ...

  7. 八大排序算法的稳定性及时间复杂度

    前言: 首先清楚何谓稳定性? 通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同.在简单形式化一下,如果Ai = Aj,Ai原来在Aj位置前,排序后Ai还是要 ...

  8. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 排序算法的总结 排序算法及其稳定性

    排序算法总结: 1.桶排序 2.选择排序 3.冒泡排序 4.插入排序 5.归并排序 6.希尔排序 7.快速排序 8.基数排序 9.堆排序 排序算法的稳定性通俗地讲就是能保证排序前2个相等的数其在序列的 ...

最新文章

  1. 华为推CPU Turbo,荣耀Note10突破3000档
  2. 运算放大器在强电磁干扰下会出现什么变化?
  3. python爬虫教程网-Python爬虫全集
  4. 同事操作两个数据源保持事务一致_终于有人把分布式事务说清楚了
  5. mybatis、mybatisplus的常用操作
  6. IPython 的使用
  7. CAM350 12.1版本安装
  8. AStar算法通用实现+可视化(Matlab)
  9. linux bzip2 命令,Linux bzip2 命令的使用
  10. Mac不能复制拷贝写入文件到移动硬盘,U盘怎么办
  11. Windows7安装蓝屏问题或Windows10ReadyBoost问题
  12. Unity3D启动报错的解决方案
  13. 部件级、处理机级和处理机间流水线
  14. AJP:22q11.2缺失综合征青少年gamma频带反应和远程通信中断的异常发育模式
  15. 付费代理IP——Redis数据库的安装
  16. CSS样式大全(网络收集整理)
  17. python爬虫入门(一)爬取钓鱼吧
  18. linux如何发现内存卡,分享|如何在 Linux 上查找硬件规格
  19. web中图片显示不全
  20. Heartbleed第一篇:“心脏流血”高危漏洞情况通报(4月9日结果)

热门文章

  1. 参数化建模类毕业论文文献有哪些?
  2. MPPT电源控制器设计
  3. Long类型数据比较
  4. 在Excel中给不足位数的数字前面补0
  5. android 开发刷rom,Android ROM开发(7) TF卡(金卡)自引导刷机
  6. 企业搬迁至直线50公里新地点,员工不去被要求集中办理离职,请各位大佬支招如何保证自身权益?
  7. yolov3gpu配置_基于图灵架构GPU进行keras-yolov3的配置
  8. mysql的master slave_Mysql 数据库的同步(master slave) 详解
  9. android强制选择器,谷歌手软了:不再强制在Android Q采用隔离存储沙盒机制
  10. linux设置开机自启某个命令