快速排序算法(排序详解)
来源:互联网 发布:redis同步mysql 编辑:程序博客网 时间:2024/05/17 06:30
快速排序
基本思想
快速排序又成为分区交换排序,是目前已知的实测平均速度最快的一种排序方法,它是对冒泡排序方法的一种改进。其基本思想是:通过一趟划分将要排序的序列分割成独立的三个部分,即左部、基准值、右部。其中左部的所有数据都比基准值小,右部的所有数据都比基准值大。然后再按此方法分别对左部和右部进行划分,整个排序过程通过递归进行。
操作方法
操作流程图:
操作步骤:
(1)首先我们从数组的left位置取出该数(2)作为参照物(base)。
(2)从数组的right位置向前找,一直找到比(base)小的数,如果找到,将此数赋给left位置(也就是将1赋给2),此时数组为:1,4,5,1,3,left和right指针分别为前后的1。
(3)从数组的left位置向后找,一直找到比(base)大的数,如果找到,将此数赋给right的位置(也就是4赋给1),此时数组为:1,4,5,4,3,left和right指针分别为前后的4。
(4):重复“第二,第三“步骤,直到left和right指针重合,最后将(base)插入到4的位置,此时数组值为: 1,2,5,4,3,至此完成一次排序。第五步:此时2已经潜入到数组的内部,2的左侧一组数都比2小,2的右侧作为一组数都比2大,以2为切入点对左右两边数按照"第一,第二,第三,第四"步骤进行。
算法实现
// 快速排序public static void quickSort(int[] array, int left, int right) {int pivotKey;if (left < right) {pivotKey = partitionByPivotValue(array, left, right);// 对左右数组递归调用快速排序,直到顺序完全正确quickSort(array, left, pivotKey - 1);quickSort(array, pivotKey + 1, right);}}public static int partitionByPivotValue(int[] array, int left, int right) {int pivotValue = array[left];// 枢轴选定后永远不变,最终在中间,前小后大while (left < right) {while (left < right && array[right] >= pivotValue) {--right;}// 将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上array[left] = array[right];while (left < right && array[left] <= pivotValue) {++left;}// 将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上array[right] = array[left];}// 当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上array[left] = pivotValue;return left;}
效率分析
算法性能:
时间复杂度:
当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。
所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。
空间复杂度
快速排序在每次分割的过程中,需要 1 个基准值。而快速排序的大概需要 Nlog2N次 的分割处理,所以占用空间也是 Nlog2N 个。
算法稳定性
相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。
- 快速排序算法(排序详解)
- 快速排序算法详解
- 算法详解【快速排序】
- 排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 排序算法——快速排序详解(java实现)
- 排序算法之快速排序详解
- js排序算法详解-快速排序
- 排序算法—快速排序详解
- 快速排序算法Java详解
- 算法基础--快速排序详解
- 算法之快速排序 详解!
- PHP 快速排序算法详解
- 算法之快速排序详解
- 快速排序(算法)
- 快速排序(算法)
- 快速排序(算法):
- (算法)快速排序
- 从头认识多线程-2.23 静态内部类的同步机制跟普通类相同
- 快速幂
- addEventListener和removeEventListener
- 聚集运算之group
- 文本域与input窗口中 修改placeHolder 颜色
- 快速排序算法(排序详解)
- iOS蓝牙开发(一)蓝牙相关基础知识
- 快速排序
- sdut oj 2404 super prime(素数筛)
- JAVA 类 URL
- java中重载和重写
- AngularJS之表单验证
- jquery语法
- 架构大数据分析应用