1、基本思想:

快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下:对于给定的一组记录,选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到序列中的所有记录均有序为止。

2、复杂度分析:

(1)最坏时间复杂度
最坏情况是指每次区间划分的结果都是基准关键字的左边(或右边)序列为空,而另一边区间中的记录仅比排序前少了一项,即选择的关键字是待排序记录的最小值或最大值。最坏情况下快速排序的时间复杂度为
(2)最好时间复杂度
最好情况是指每次区间划分的结果都是基准关键字的左右两边长度相等或者相差为1,即选择的基准关键字为待排序的记录的中间值。此时进行比较次数总共为 nlogn,所以最好情况下快速排序的时间复杂度为
(3)平均时间复杂度
快速排序的平均时间复杂度为。在所有平均时间复杂度为O(nlogn)的算法中,快速排序的平均性能是最好的。
(4)空间复杂度
快速排序的过程中需要一个栈空间来实现递归。最好情况,递归树的深度为,其空间复杂度也就是O(nlogn);最坏情况下,需要进行 n-1次递归,其空间复杂度为O(n);平均情况,空间复杂度为O(nlogn).
(5)基准关键字的选取,基准关键字的选取是决定快速排序算法的关键,常用的基准关键字的选取方式如下:
第一种:三者取中。将序列首、尾和中间位置上的记录进行比较,选择三者中值作为基准关键字。
第二种:取left和right之间的一个随机数,用n[m]作为基准关键字。采用这种方法得到的快速排序一般称为随机的快速排序。

3、排序过程如下:

以数组{49,38,65,97,76,13,27,49}为例,选择第一个元素49为基准
初始化关键字: [49,38,65,97,76,13,27,49]

4、Java实现如下:

public class QuickSort {public static void sort(int a[], int low, int hight) {int i, j, index;if (low > hight) {return;}i = low;j = hight;index = a[i]; // 用子表的第一个记录做基准while (i < j) { // 从表的两端交替向中间扫描while (i < j && a[j] >= index)j--;if (i < j)a[i++] = a[j];// 用比基准小的记录替换低位记录while (i < j && a[i] < index)i++;if (i < j) // 用比基准大的记录替换高位记录a[j--] = a[i];}a[i] = index;// 将基准数值替换回 a[i]sort(a, low, i - 1); // 对低子表进行递归排序sort(a, i + 1, hight); // 对高子表进行递归排序}public static void quickSort(int a[]) {sort(a, 0, a.length - 1);}public static void main(String[] args) {int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };quickSort(a);System.out.println(Arrays.toString(a));}
}

【排序算法】快速排序原理及Java实现相关推荐

  1. java实现apriori算法_七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序员,一个正再 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己再这块确实很弱,需要大补(残废了一般) ...

  2. 八大排序算法---快速排序原理及代码

    冒泡排序 选择排序 直接插入排序 希尔排序 归并排序 基数排序 堆排序 快速排序 分治法:比大小,再分区 1.从数组中取出一个数,作为基准数. 2.分区:将比这个数大或等于的数全放到他的右边,小于他的 ...

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

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

  4. java实现apriori算法_各种排序算法的分析及java实现(一)

    阅读本文约需要7分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下用Navicat for Mysql导入.sql文件的 ...

  5. dv算法java实现_各种排序算法的分析及java实现(二)

    更多精彩,请点击上方蓝字关注我们! 上次跟大家分享了下各种排序算法的分析及java实现(一)的相关知识,今天跟大家分享各种排序算法的分析及java实现(二)的知识.昨天我们讲到了选择排序,今天我们继续 ...

  6. 【图解算法】排序算法——快速排序

    简介 首先还是得简单的介绍一下快速排序这个算法. 快速排序(Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, ...

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

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

  8. 排序算法 快速排序 python 0913

    排序算法 快速排序 python 0913 快速排序 思路 定义快排方法 接收参数:原始列表,起始位置,终止位置 判断是否符合快排条件,当起始下标与终止下标相等时,代表只有一个元素,无法排序,退出 一 ...

  9. 排序算法 快速排序【详细步骤图解】

    排序算法 快速排序[详细步骤图解] 快速排序 主要思想 图解 第一轮分割序列 第二轮分割序列 --- 左子序列 小结 第三轮分割序列 --- 右子序列 C++实现 总结 快速排序 给定一个序列:22 ...

  10. 11 种加密 哈希算法的原理及其 Java 实现

    11 种加密 & 哈希算法的原理及其 Java 实现 一.目的 二.运行环境 三.基本原理及步骤 (I)各种加密算法的原理: ① DES 数据加密标准(Data Encryption Stan ...

最新文章

  1. 7个Debug linux程序的Strace 列子
  2. tdk怎么设置_不知道怎么分析对手网站?看这里!
  3. 遇见BUG(3)critical warning也要关注!
  4. C++实现求数组中前K大的数
  5. Xamarin Essentials教程屏幕常亮ScreenLock
  6. Android 测试支持库 1.0 现已发布!
  7. javascript进阶课程--第一章--函数
  8. 大班科学计算机的发明应用教案,大班科学教案:机器人探密
  9. [转载]博客园MetaWeblog使用帮助
  10. 演示Go语言多返回值功能
  11. Unitest框架的使用(二)Unittest断言及应用
  12. android studio 继承关系 快捷键,Android Studio快捷键
  13. 一个按钮控制暂停和开始java_《第一炉香》|一个女人的自甘堕落,从控制不住欲望开始...
  14. 1.2 矩阵与线性方程组-向量空间、内积空间与线性映射
  15. bzoj 4300绝世好题
  16. 手把手教你调用微信扫一扫,三分钟包会
  17. 好用的万年历API推荐
  18. 数值分析(一) 牛顿插值法及matlab代码
  19. QUAR_CH_USB2TTL V1 USB转4路UART串口侦听板设计日志1
  20. 夜神模拟器怎么设置android版本号,adb连接夜神模拟器(包括安装adb,夜神模拟器)需要将夜神模拟器的版本号与adb版本一致...

热门文章

  1. RabbitMQ系列笔记主题订阅模式
  2. 计算机配置方案2018,写给设计师的电脑配置攻略之PS篇 2018-08-15
  3. mii-tool的限制/mii-tool和千兆网络
  4. Cert Manager 申请SSL证书流程及相关概念-二
  5. FMVSS 302 联邦交通车辆安全标准
  6. 2023年广州深圳市两融开户佣金和融资融券利息率最低多少?哪个券商最低?支持量化交易
  7. 移动互联网产品设计的原则
  8. maya骨骼架设、蒙皮绑定与权重修正
  9. USB 1~3.0 基礎知識
  10. CVSS评分策略分析及近年来满分漏洞盘点