1.什么是快速排序算法

快速排序是对冒泡排序的一种改良版,通过一趟排序,把要排序的序列分割成两个部分,一部分的所有数据要比另一部分的数据都小,然后再根据这两部分的数据来进行快速排序。以此来达到整一个数据都变成了有序序列。

(1)快速排序基本思路

  • 首先快速排序要选取一个基准值,以基准值为分割,把比该基准值小的放左边,基准值大的放右边。然后得出来的序列再进行快速排序。

(2)快速排序的应用场景

  • 快速排序的时间复杂度为O(nlogn),是目前基于比较的内部排序里被认为是最好的方法,当数据过大并且数据是杂乱无序的时候,适合用快速排序。

(3)快速排序的优缺点

  • 优点:平均性能好O(nlogn)
  • 缺点:不稳定,如果初始的序列或基本的序列是有序的时候,时间复杂度为O(n²)。

2.快速排序算法图解

  • 第一趟排序:以初始数据的头元素作为基准值来进行分割,把比25小的作为一部分,比25大的又作为一部分。
  • 第二趟排序:比25小的那一部分以开头的15作为基准值来拆分成两部分,比15小的为一部分(8,12,4,10),比15大的为一部分(20)。此外另一组是比25大的,以46为基准值,比46小为一部分,比46大为一部分。
  • 第三趟排序:比15小的以开头的8作为基准值又开始进行分组,分为比8小和比8大这两部分。
  • 最后合并出来的数据就是已经排序好了的

  • 拆分原理讲解

    • 1.先是right从右往左找,寻找比基准值小的数,找到了10。接着left指针开始从左往右找,寻找比基准值大的数,找到了31,这时10与31进行互换。
    • 2.然后right继续从右往左找,找到了4。然后left开始从左往右找,找到了46,这时4与46的位置进行交换。
    • 3.这时right继续从右往左找,找到了15。left也开始从左往右找,它也到了15的位置。说明整个数据已经遍历过一次了。然后就是基准值跟两个指针重合的位置进行交换。
  • 基准值的选取
    • 固定位置选取基准值:选取第一个或者是最后一个元素作为基准值
    • 随机选取基准值:选取待排序里的任意一个数作为基准值
    • 三数取中法:取第一个数与中间数和最后一个数来比较,哪一个在中间那就以谁作为基准值。如:‘10’,‘44’,‘2’,这三个数10在中间,取10。

3.快速排序算法编码实现

(1)整体代码实现

public class QuickSort {public static void main(String[] args) {int[] arr = {25,12,20,31,8,46,15,4,50,10};System.out.println("排序前:");System.out.println(Arrays.toString(arr));quickSort(arr,0,9);System.out.println("排序后:");System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr,int leftIndex,int rightIndex){//递归 如果左边的索引大于右边的索引,跳出循环,递归结束if(leftIndex>rightIndex){return;}int left = leftIndex;int right = rightIndex;//定义基准值int key = arr[left];//扫描左边跟右边的数字,只有当left<right的时候才会循环while(left<right){//右边 找到一个最小的基准值,从右指针向前开始找while (right>left && arr[right]>=key){right--;}//找到之后,交换值arr[left] = arr[right];//左边 找到大于基准值的数字,从左指针向后开始找while(left<right && arr[left]<=key){left++;}//找到之后,交换值arr[right]=arr[left];//执行到这步,left=right,基准值归位arr[left]=key;//递归调用,对基准值左边的元素进行排序quickSort(arr,leftIndex,left-1);//递归调用,对基准值右边的元素进行排序quickSort(arr,right+1,rightIndex);}}
}

(2)运行结果

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

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

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

  2. 排序算法 | 快速排序算法原理及实现和优化(一)

    快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快速排序的基本思想是:通过一趟排序将要排序的数 ...

  3. 用openAI写个js的排序算法(快速排序算法)

    文章目录 一.生成JS快速排序算法 二.openai还会给出调用方法 一.生成JS快速排序算法 这是一个通用的 JavaScript 排序算法.它使用的是快速排序算法. function sort(a ...

  4. 排序算法——快速排序算法

    快速排序的基本思想: 通过一趟排序将待排记录分隔成独立的两部分,一部分记录的关键字比基准值小,一部分记录的关键字比基准值大,然后再对这两部分进行同样操作. 1.快速排序递归算法 //快速排序,递归 i ...

  5. 快速排序算法(基于Java实现)

    title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...

  6. python实现快排算法_Python实现快速排序算法

    Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide and ...

  7. python快速排序代码_Python实现快速排序算法

    原标题:Python实现快速排序算法 Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通 ...

  8. Go语言编程:Go语言实现快速排序算法

    前言 今天用Go语言实现下经典排序算法--快速排序算法.主要是学习了Go语言,得用它来干点事情嘛,就用快速排序来练手.在Go语言语法方面,主要用到 切片数组,for循环(Go语言没有while循环), ...

  9. 排序算法:快速排序算法实现及分析(递归形式和非递归形式)

    快速排序算法介绍 从名字上就可以看出快速排序算法很嚣张,直接以快速命名.确实快速排序 的确很快速,被列为20世纪十大算法之一.程序员难道不应该掌握么.快速排序(Quick Sort)的基本思想是:通过 ...

  10. 快速排序 算法 详解 及 深度优化

    下面简介经典算法  快速排序算法 实现及优化. (欢迎大家指点,继续提出优化的方法,共同提高) 基本思想:(以按从小到大排序为例说明)通过多次的排序,每次的排序均将要排序的数组分为两部分,前一部分均比 ...

最新文章

  1. 提高cube性能的一些方法(一)
  2. 模拟IO 读写压力测试
  3. android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
  4. [转]移动应用统一化的谎言:一次编译,到处运行不可能
  5. 最新黑链代码expression:隐藏链接代码
  6. redis源码之sds
  7. DVWA学习(一)SQL Injection
  8. 详解linux的initrd
  9. Java线程之守护线程(Daemon)
  10. Extjs 登录界面源码
  11. 【SPOJ】Power Modulo Inverted(拓展BSGS)
  12. Question | 网站被黑客扫描撞库该怎么应对防范?
  13. mysql(1):修改数据库密码
  14. 云计算教程学习入门视频:云计算的模型都有哪些
  15. Java泛型(8):自限定参数协变
  16. es数据无法写入,报错[FORBIDDEN/12/index read-only / allow delete (api)]
  17. wxpython 基本的控件 (文本)
  18. uniapp文件路径转base64格式
  19. 51单片机循迹小车工作原理与程序设计思路
  20. 工欲善其事必先利其器-前端实习简历篇

热门文章

  1. [统计学理论基础] 方差 协方差 标准差
  2. 开发微信小程序入门教程,含破解工具
  3. XC3101锂电池充电IC(耐高压,带OVP)
  4. Ubuntu安装autoconf
  5. ping不通的常见原因和解决办法
  6. python培训免费视频
  7. 手把手教学MFC吃豆子教程
  8. python求标准正态分布的分布函数值(具体实现及调用函数)
  9. 用JavaScript七夕表白,旋转的爱情魔方!
  10. 【if 的高阶用法练习题】if only / I wish