【概述】

快速排序是一种不稳定的排序方法,其同样属于交换排序,是对冒泡排序的一种改进:在冒泡排序中,记录的比较与移动是在相邻位置进行的,记录每次交换只能后移一个位置,因而总的比较次数与移动次数较多;而在快速排序中,记录的比较与移动是从两端向中间进行的,关键码较大的记录一次就能从前面移动到后面,关键码较小的记录一次就能从后面移动到前面,由于记录移动的距离较远,从而减少了总的比较次数与移动次数。

【实现过程】

快速排序利用了分治策略,其基本思想是:首先选一个轴值,作为比较的基准,将待排序记录划分为独立的两部分,左侧记录均小于等于轴值,右侧记录均大于等于轴值,然后分别对这两部分重复上述过程,直至序列有序。

显然,快速排序是一个递归的过程,其具体的实现为:

  1. 在待排序的 n 个记录中任选一个进行记录(通常选第一个),作为轴值
  2. 进行分区,将所有比轴值小的元素放在轴值左边,所有比轴值大的元素放在轴值的右边,中间为所选的轴值
  3. 对左右两个分区递归进行步骤 1、2,递归结束条件是序列的大小是 1

【时空复杂度分析】

快速排序是一种不稳定的排序方法,其最差时间复杂度为 O(n^2),最优时间复杂度为O(nlogn),平均时间复杂度为 O(nlogn)

由于其是递归的,需要一个栈来存放每一层递归调用的必要信息,最大容量应与递归调用的深度一致,最优空间复杂度为 O(logn),最差空间复杂度为 O(n),平均空间复杂度为 O(logn)

【源程序】

1.一次划分算法与递归实现

设带划分的区间是 a[left]~a[right],具体的一次划分算法如下:

int partitoin(int a[],int left,int right){int pivotKey=a[left];//轴值int i=left,j=right;while(i<j){while(i<j&&a[j]>=pivotKey)//右侧扫描j--;swap(a[i],a[j]);//比轴值小的交换到低端while(i<j&&a[i]<=pivotKey)//左侧扫描i++;swap(a[i],a[j]);//比轴值大的交换到高端}return i;//返回轴值所在位置
}

对待排序序列进行一次划分后,再分别对左右两个子序列进行快速排序,直到每个分区都只有一个记录为止

初始调用 quickSort(a,0,n-1) 即可

void quickSort(int a[],int left,int right){if(left<right){int pivotKey=partitoin(a,left,right);//算出轴值并根据轴值进行分区quickSort(a,left,pivotKey-1);//低子表递归quickSort(a,pivotKey+1,right);//高子表递归}
}

2.综合实现版

将一次划分与递归实现相结合,初始调用

void quickSort(int a[],int left,int right){if(left>=right)return;int pivotKey=a[left];//轴值int i=left,j=right;while(i<j){while(i<j&&a[j]>=pivotKey)//从右向左扫描,找第一个码值小于key的记录,并交换到keyj--;a[i]=a[j];//赋给前面被拿走的a[i]while(i<j&&a[i]<=pivotKey)//从左向右扫描,找第一个码值大于key的记录,并交换到右边i++;a[j]=a[i];//赋给前面被拿走的a[j]}a[i]=pivotKey;//分区元素放到正确位置quickSort(a,left,i-1);quickSort(a,i+1,right);
}

理论基础 —— 排序 —— 快速排序相关推荐

  1. 排序-交换类排序--快速排序简介

    交换类排序有冒泡和快排 冒泡排序相对简单,之前总结过: https://blog.csdn.net/u011109881/article/details/80038573 快速排序 参考: 数据结构( ...

  2. DS排序--快速排序

    题目 问题 C: DS排序--快速排序 时间限制: 1 Sec 内存限制: 128 MB 提交: 480 解决: 303 [提交][状态][讨论版] 题目描述 给出一个数据序列,使用快速排序算法进行从 ...

  3. 【啊哈!算法】算法3:最常用的排序——快速排序

    [啊哈!算法]算法3:最常用的排序--快速排序        上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到 ...

  4. 最常用的排序---快速排序法

    最常用的排序-快速排序法 桶排序浪费空间,冒泡排序虽然解决了空间问题却在算法的执行效率上牺牲了很多,因此我们的快速排序法就诞生了,是不是听这个名字就很高档呢? 假设现在需要对"6,1,2,7 ...

  5. java 快排_八大排序-快速排序(搞定面试之手写快排)

    概要 快速排序由C. A. R. Hoare在1960年提出,是八大排序算法中最常用的经典排序算法之一.其广泛应用的主要原因是高效,核心算法思想是分而治之.快速排序经常会被作为面试题进行考察,通常的考 ...

  6. 冒泡排序 选择排序 快速排序(C语言)

    #include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数#define arrayS ...

  7. 排序---快速排序及其切分函数Partition应用

    快速排序   快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了. 代码如下: public class Sort ...

  8. 看动画学算法之:排序-快速排序

    文章目录 简介 快速排序的例子 快速排序的java代码实现 随机快速排序的java实现 快速排序的时间复杂度 简介 快速排序也采用的是分而制之的思想.那么快速排序和归并排序的区别在什么地方呢? 归并排 ...

  9. 算法-排序-快速排序(包含多种快速排序)

    快速排序 特点:原址排序,最坏的时间复杂度O(n^2) 平均时间复杂度O(nlgn) 比归并排序系数常数项小 不稳定 底部有最坏时间复杂度为Ω(nlgn)的快速排序地址 void quick_sort ...

最新文章

  1. VS2005相关----整理起始页面板
  2. 01. 对称密码——算法
  3. pycharm 调试(debug)模式时界面上的 mute breakpoint 是什么意思?(239)
  4. jdbc oracle存储过程,java jdbc 执行oracle存储过程
  5. 形象易懂讲解算法I——小波变换
  6. 理论基础 —— 队列
  7. 虎牙AI基础技术部招聘深度学习/计算机视觉实习生
  8. UILabel和NSAttributedString那些事
  9. JS日历控件优化(增加时分秒)
  10. iOS——json数据解析
  11. CentOS 6.6源码编译升级GCC至4.8.2
  12. 深度学习怎么入门?零基础快速入门深度学习
  13. Java PCM音频变声
  14. 苹果iphone手机哪些机型支持刷公交卡
  15. 纸壳CMS可视化建站系统搭建多语言网站
  16. php自学建议_php自学提升进阶路线
  17. Linux命令卸载谷歌浏览器,UBUNTU16.04安装谷歌浏览器卸载firefox浏览器
  18. 分销商城系统开发应用概述详解
  19. 炸鸡鸭背后的真相 —— 一位良心发现者的自白[转]--希望提起大家的注意力
  20. 网易楚留香获取服务器信息,楚留香日常任务流程一览 新手大侠不能错过

热门文章

  1. 跟2G说再见?这些IoT“钉子户”表示做不到……
  2. 程序员界年度人口普查:6成以上开发者日工作超9小时,且从不运动
  3. python深度神经网络量化_「深度神经网络」(deep neural network)具体是怎样工作的?...
  4. 漫画:凌晨2点,老板在工作群@了我...
  5. FinTech专题:支付平台建设资金底线防火墙的杀手级设计方案
  6. JEECG 版本更新日志
  7. Linux系统:centos7下搭建Nginx和FastDFS文件管理中间件
  8. Python模块开发【Distutils】
  9. 同步函数与同步代码块的区别
  10. Ros学习——roslaunch