快速排序是最流行的,也是速度最快的排序算法(C++ STL 的sort函数就是实现的快速排序); 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据序列变成有序序列。其算法的特点就是有一个枢轴(pivot), 枢轴左边的元素都小于/等于枢轴所指向的元素, 枢轴右边的元素都大于枢轴指向的元素;

快速排序算法思想:

设要排序的数组是A[0], ..., A[N-1],首先任意选取一个数据作为standard(通常选用数组的最后一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面(其实只要保证所有比他小的元素都在其前面,则后一条件则自动满足了),这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。(信息来源:百度百科)

一次划分

目标:

找一个记录,以它的关键字/下标作为”枢轴/pivot”,凡是值小于枢轴的元素均移动至该枢轴所指向的记录之前,凡关键字大于枢轴的记录均移动至该记录之后。

致使一趟排序之后,记录的无序序列R[s..t]将分割成两部分:R[s..i-1]和R[i+1..t],且

R[j].value ≤ R[i].value ≤ R[j].value

//实现
template <typename Type>
int partitionBy3Loop(Type *array, int p, int r)
{int i = p;int j = r+1;    //j:超出末尾元素额下一位置Type x = array[p];  //将最左边的元素作为枢轴元素//将<x的元素交换到左边区域//将>x的元素交换到右边区域while (true){//找到一个比x大(>=x)的元素while (i < r && array[++i] < x);//找到一个比x小(<=x)的元素while (array[--j] > x);if (i >= j)break;//交换std::swap(array[i], array[j]);}//将枢轴元素与array[p]进行交换std::swap(array[p], array[j]);//返回枢轴return j;
}
/**说明:几乎国内所有的数据结构与算法的教材中的Partition实现都类似于上面的那一种, 虽然易于理解,但实现过于复杂;<算法导论>中给出了另一种实现方式,该方式虽然不易于理解(其实明白其原理之后你就会爱上她),但是比较容易实现!
*/
template <typename Type>
int partitionBy1Loop(Type *array, int p, int r)
{Type x = array[r];  //x作为最终枢轴所指向的元素//i指向的是枢轴左边的最后一个元素//也就是与x左邻元素的下标int i = p - 1;//j则不断的寻找下一个<=x的元素for (int j = p; j < r; ++j){if (array[j] <= x){++ i;std::swap(array[i], array[j]);}}std::swap(array[i+1], array[r]);//最终使得所有(i+1)左边的元素都<=array[i+1],//因此, 所有array[i+2:r]的元素都是大于array[i+1]的return i+1;
}

快速排序

首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个子序列“递归”进行快速排序。

//实现
template <typename Type>
void quickSort(Type *array, int p, int r)
{if (p < r){int pivot = partitionBy1Loop(array, p, r);quickSort(array, p, pivot-1);quickSort(array, pivot+1, r);}
}

快速排序的时间复杂性

假设一次划分所得枢轴位置 i = k,则对 n 个记录进行快排所需时间:

T(n) = {Tpass(n) + T(k-1) + T(n-k) |Tpass(n)为对 n 个记录进行一次划分所需时间}

若待排序列中记录的关键字是随机分布的,则 k 取 1 至 n 中任意一值的可能性相同。

由此可得快速排序所需时间的平均值为:

设 Tavg(1)≤b,则可得结果:

因此:快速排序的时间复杂度为O(nlogn)

若待排记录的初始状态为按关键字有序时,快速排序将蜕化为起泡排序,其时间复杂度为O(n^2)。

为避免出现这种情况,需在进行一次划分之前,进行“预处理”,即:先对 R(s).key,  R(t).key 和 R[ë(s+t)/2û].key,进行相互比较,然后取关键字为三个元素中居中间的那个元素作为枢轴记录。

数据结构基础(4) --快速排序相关推荐

  1. “数据结构基础”系列网络课程主页

    #前言 自从下决心要解决学生动手能力差的问题,开始了课程实践资源的建设之旅:自迷上了翻转课堂,所教课程的视频,也就逐渐形成了体系.在为我自己的校内学生服务的同时,也希望能够让更多人有机会用到. 自全身 ...

  2. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  3. 数据结构基础知识核心归纳(一)

    数据结构基础知识核心归纳(一) 转载请声明出处:http://blog.csdn.net/andrexpert/article/details/77900395 Android             ...

  4. 求单链表的最大值与原地逆转_数据结构基础复习09.ppt

    数据结构基础复习09.ppt 数据结构考研辅导 基础复习 浙江大学计算机学院 内容提纲 考研概述 考察目标理解数据结构的基本概念 掌握数据结构的逻辑结构 存储结构及其差异 以及各种基本操作的实现 在掌 ...

  5. 【数据结构基础】之数组介绍,生动形象,通俗易懂,算法入门必看

    前言 本文为数据结构基础数组相关知识,下边将对数组的定义.性质及结构,数组的各种玩法如循环遍历数组.查找数组最大值.数组元素的位移等,二维数组的定义及用法等进行详尽介绍~ Java全栈学习路线可参考: ...

  6. Algorithm:【Algorithm算法进阶之路】之数据结构基础知识

    Algorithm:[Algorithm算法进阶之路]之数据结构基础知识 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...

  7. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  8. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  9. 数据结构基础入门知识

    数据结构基础入门知识 ------ 数据结构:理解和练习 <异类-不一样的成功启示录> IP/26 192 IP/25 128 IP/24 192. 128 64  32 16  2  1 ...

最新文章

  1. Spring Stateless State Security第3部分:JWT +社会认证
  2. 杭电OJ分类题目(3)
  3. 搭建新环境的准备工作
  4. Java贪吃蛇游戏开发
  5. C#报错Newtonsoft.Json.JsonSerializationException: “A member with the name ‘phone‘ already
  6. cydia多开微信_cydia怎么安装微信
  7. 用计算机处理文字单元设计,计算机应用基础单元设计62(处理图像).doc
  8. 虚拟贝司拓展音源-Toontrack Acoustic EBX
  9. 7-4 房产税费计算2022 (12 分)
  10. RPG Maker MV 图块冲突解决、素材管理
  11. 【游戏外挂、修改器、辅助研究1】认识外挂
  12. CAD填充颜色透明颜色设置
  13. 【Qt入门第23篇】 数据库(三)利用QSqlQuery类执行SQL语句
  14. Android 插件化之—— 加载插件中的资源
  15. linux spool输出一行 不换行,clob内容spool到文件中后,怎么去掉自动换行
  16. Android面试攻略
  17. 计算机程序工作日志,计算机程序员实习日记大全
  18. E: Unable to locate package openjdk-8-jre ubuntu 20.04安装jdk 失败
  19. NPM配置阿里下载源
  20. 基于java web的设备运维报修管理系统

热门文章

  1. 计组之存储系统:3、主存与CPU的链接(字扩展、位扩展、字位扩展、74LS138)
  2. 操作系统之内存管理:4、基本地址变换机构(段氏、页式、段页式)
  3. ar - 创建静态库.a文件
  4. 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
  5. qt widget 窗口句柄的问题
  6. QT 提示之右下角冒泡
  7. 使用foreach循环遍历集合元素
  8. 斗地主综合案例之有序版本
  9. python json按输入顺序输出内容
  10. Mysql ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA