快速排序是一个优秀的排序算法,O(n²)和Ω(nlgn),期望运行时间:θ(nlgn)且常数因子较小。

快排运用了分治的思想

分:将数组划分成两部分(核心,partition)

治:递归地对划分地两个子数组进行排序

合并:无需合并,因为快排是直接在数组内部进行元素交换的

以下给出Partition的几种实现方法和优化方法:

实现一(标准版)

①选取首元素或尾元素为主元(pivot)

②从前往后遍历,遇到不比自己大的元素就把它移到前面(同时把大的移到后面)

③将pivot与A[q]交换

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;void quickSort(int a[], int low, int high);int a[10] = {5,2,1,5,6,3,9,0,3,8}; int main()
{srand(time(NULL));quickSort(a,0,9);for(int i=0; i<10; ++i)cout<<a[i]<<' ';return 0;
}void quickSort(int a[], int low, int high)
{if(low >= high) return;int i = low - 1;int j = rand() % (high - low + 1) + low;swap(a[high], a[j]);int flag = a[high];for(int j = low; j < high; ++j)if(a[j] <= flag)swap(a[++i], a[j]);swap(a[++i], a[high]);quickSort(a, low, i-1);quickSort(a, i+1, high);
}

【实现二】(Hoare划分)

①分别从前面和后面开始遍历找到一个不比主元小的数a和b,交换a和b

②一直循环到整个数组被遍历

注:最后子数组A的元素全部小于等于子数组B的元素

【优化一】(随机化快排)

方法:随机选取元素与首(尾)元素交换,然后选取首(尾)元素为pivot

意义:加强随机性,使得其成为一个真正的随机化算法,即使在元素全部逆序的情况下也能保持Θ(nlgn)的速度

【优化二】(与插入排序结合)

方法:当n≤k(可能为500)时候,改用插入排序(O(n)~O(n²))

意义:减少递归的次数,且当数组"几乎有序"时,插入排序较快

【优化三】(针对元素值相同的快速排序)

方法:

①先把比pivot(A[1])小的放到前面(A[2...q])

②从q+1找和pivot相等的元素,跳过

③从数组尾向前遍历,将与pivot相等的元素转移到中间

意义:避免较多元素相等时导致复杂度骤增为θ(n²)

缺点:增加了比较的次数

pivot_t partition(int A[], int p, int r) {int x = A[r - 1],q = p,t,tmp;for (int i = p; i < r - 1; i++) {if (A[i] < x) {EXCHANGE(A[q], A[i]);q++;}}for (t = q; t < r && A[t] == x; t++);for (int i = r - 1; i >= t; i--) {if (A[i] == x) {EXCHANGE(A[t], A[i]);t++;}}pivot_t result = {q, t};return result;
}

【优化四】(尾递归技术)

方法:将对右数组的递归调用转化为一个循环结构

意义:(不太清楚,好像是减少下栈深度)

TAIL-RECURSIVE-QUICKSORT(A, p, r)while p < r// Partition and sort left subarrayq = PARTITION(A, p, r)TAIL-RECURSIVE-QUICKSORT(A, p, q - 1)p = q + 1

【优化五】(三数取中划分)

方法:取三个数的中位数作为pivot

意义:增大"好的划分"的概率

快排两种实现及五种优化相关推荐

  1. 保卫资金链:资金链的五种死法和五种活法

    转载-保卫资金链:资金链的五种死法和五种活法 (2009-02-12 22:33:10)  哪家公司是现金流管理的标杆企业? "通用汽车.可惜它因为现金枯竭也要倒掉了."2008年 ...

  2. 外贸行业找客户的三种方式和五种工具

    都说外贸难,找客户更难,那就让我们长话短说,直接告诉你三种找客户的方式. 1.搜索引擎 有多少人知道可以通过搜索引擎来搜索和开发客户的?这是外贸人用来开拓客户最常用的手段之一.很多人都会用google ...

  3. 战神快排教你网站长尾关键词SEO优化的方法

    本篇文章,战神快排小编将和大家一起了解长尾关键词的优化方法.相信对于一些SEO新手会有很大的帮助的,当然你如果是一个SEO的老手,那么你可以看看是否和你以前的认知有所差异. 长尾关键词该如何优化?战神 ...

  4. 数据结构之排序【归并排序和快排的顶级优化和快排的三种原理的实现及分析】 内含动态演示图

    文章目录 引言: 1.归并排序(MergeSort) 2.快速排序的优化(顶级优化) 3.快速排序的三种思路的代码实现及分析 4.归并排序和快排第3原理的测试 引言: 刚刚去回顾了一下递归实现的几个小 ...

  5. redis五种常见的数据结构

    文章目录 概述 一.对象的类型和编码 二.五种数据结构 五种数据结构的底层实现结构 1.字符串(String) 1)int 编码 2)embstr 编码 3)raw 编码 2.列表(List) 1)z ...

  6. 从“五种权力论”说新人入职要点

    嗯,这算欠的帐,我得还. 在前面<再论IT人员应聘建议>的博文中,有个"shuishouchuan"朋友问了我一个问题,由于当时为了应付论战,我当时回复得较为简单,不过 ...

  7. 企业风险管理的四种模式五种策略分别是什么?

    企业风险管理一直是一个经久不衰的话题,企业风险管理对于企业主来说尤为重要,这在很大程度上关系着企业能否健康的发展.鉴于很多人对于企业风险管理这一内容了解不是很透彻,今天分享企业风险管理的四种模式和五种 ...

  8. 一定能用到的简单但实用的五种按钮样式(原生HTML+CSS步骤详解,含详细注释)

    前言一   按钮在前端开发中往往是一个必不可少的元素,也有许多精美好看的样式资源供开发者直接使用.但博主认为,对于初学者而言,总是去cv别人做好的,而不理解其中的原理,是很不好的.   本人作为一名计 ...

  9. 五种IO模型:阻塞/非阻塞/复用/信号驱动/异步IO模型

    五种IO模型:阻塞/非阻塞/复用/信号驱动/异步IO模型 1. IO基本概念 1.1 IO概念 1.2 IO的两个阶段 1.2.1 IO的两个阶段-例子说明 1.2 IO种类 2. 五种IO模型 2. ...

最新文章

  1. ElasticSearch聚合aggs入门
  2. 牛客网(剑指offer) 第十题 矩形覆盖
  3. Linux下V4L2捕捉画面+H264压缩视频+帧缓冲显示视频————H264压缩视频
  4. 2015蓝桥杯省赛---java---B---10(生命之树)
  5. 【C++ grammar】抽象、封装与this指针
  6. python中文编程教学_中谷python中文视频教程(全38集)
  7. java作业 雏田的两个技能 类与对象
  8. 关于精英版stm32从模板工程移植RTT Spi驱动打开后编译不过的处理办法
  9. python实现485通讯_Python编程实现USB转RS485串口通信
  10. SharePoint 设置Library中文档的默认打开方式
  11. PHP添加网站版权信息,如何将版权和作者信息添加到用PHP创建的图像?
  12. 解决docker下载安装速度慢的问题
  13. Unity UI框架思路与实现
  14. matlab中累乘,numpy中的裁剪、压缩和累乘
  15. CCU ETL脚本列表
  16. 瞬时转速 matlab,基于瞬时转速的发动机故障诊断研究
  17. 班旗怎么用软件设计,(最新整理)班旗设计大赛主持词
  18. Html+Vue实现五子棋游戏(单机版)
  19. 【Opencv基础学习】 VideoWriter打开本地摄像头并保存mp4格式视频
  20. python实现自动发送qq消息

热门文章

  1. 欢迎大家多踩踩偶的个人博客噶 哇哈哈
  2. html chm 64,Win7 64位下的CHM
  3. JD-GUI for Mac
  4. android集成twitter登录
  5. 深入理解Java虚拟机——加载和存储指令
  6. 解决import org.junit.Test 和@Test报错
  7. Tiled Map Editor(一)
  8. 《AV1 Bitstream Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 05-语法结构-Section 01~08
  9. python数学库函数包括求最大公约数函数吗_pythonmathcot函数_math库是python语言的数学模块吗_Python中的数学模块:...
  10. STM8S的ADC配置