【算法】快速排序算法原理及实现
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)运行结果
【算法】快速排序算法原理及实现相关推荐
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 排序算法 | 快速排序算法原理及实现和优化(一)
快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快速排序的基本思想是:通过一趟排序将要排序的数 ...
- 用openAI写个js的排序算法(快速排序算法)
文章目录 一.生成JS快速排序算法 二.openai还会给出调用方法 一.生成JS快速排序算法 这是一个通用的 JavaScript 排序算法.它使用的是快速排序算法. function sort(a ...
- 排序算法——快速排序算法
快速排序的基本思想: 通过一趟排序将待排记录分隔成独立的两部分,一部分记录的关键字比基准值小,一部分记录的关键字比基准值大,然后再对这两部分进行同样操作. 1.快速排序递归算法 //快速排序,递归 i ...
- 快速排序算法(基于Java实现)
title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...
- python实现快排算法_Python实现快速排序算法
Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide and ...
- python快速排序代码_Python实现快速排序算法
原标题:Python实现快速排序算法 Python实现快速排序算法 快速排序算法是一种基于交换的高效的排序算法,由C.R.A.Hoare于1962年提出,是一种划分交换排序.它采用了一种分治的策略,通 ...
- Go语言编程:Go语言实现快速排序算法
前言 今天用Go语言实现下经典排序算法--快速排序算法.主要是学习了Go语言,得用它来干点事情嘛,就用快速排序来练手.在Go语言语法方面,主要用到 切片数组,for循环(Go语言没有while循环), ...
- 排序算法:快速排序算法实现及分析(递归形式和非递归形式)
快速排序算法介绍 从名字上就可以看出快速排序算法很嚣张,直接以快速命名.确实快速排序 的确很快速,被列为20世纪十大算法之一.程序员难道不应该掌握么.快速排序(Quick Sort)的基本思想是:通过 ...
- 快速排序 算法 详解 及 深度优化
下面简介经典算法 快速排序算法 实现及优化. (欢迎大家指点,继续提出优化的方法,共同提高) 基本思想:(以按从小到大排序为例说明)通过多次的排序,每次的排序均将要排序的数组分为两部分,前一部分均比 ...
最新文章
- 提高cube性能的一些方法(一)
- 模拟IO 读写压力测试
- android中edittext设置密码格式,Android 自定义EditText(带清理、密码可见、不可见)...
- [转]移动应用统一化的谎言:一次编译,到处运行不可能
- 最新黑链代码expression:隐藏链接代码
- redis源码之sds
- DVWA学习(一)SQL Injection
- 详解linux的initrd
- Java线程之守护线程(Daemon)
- Extjs 登录界面源码
- 【SPOJ】Power Modulo Inverted(拓展BSGS)
- Question | 网站被黑客扫描撞库该怎么应对防范?
- mysql(1):修改数据库密码
- 云计算教程学习入门视频:云计算的模型都有哪些
- Java泛型(8):自限定参数协变
- es数据无法写入,报错[FORBIDDEN/12/index read-only / allow delete (api)]
- wxpython 基本的控件 (文本)
- uniapp文件路径转base64格式
- 51单片机循迹小车工作原理与程序设计思路
- 工欲善其事必先利其器-前端实习简历篇