快速排序算法(排序详解)
2016-05-18 21:19
183 查看
快速排序
基本思想
快速排序又成为分区交换排序,是目前已知的实测平均速度最快的一种排序方法,它是对冒泡排序方法的一种改进。其基本思想是:通过一趟划分将要排序的序列分割成独立的三个部分,即左部、基准值、右部。其中左部的所有数据都比基准值小,右部的所有数据都比基准值大。然后再按此方法分别对左部和右部进行划分,整个排序过程通过递归进行。操作方法
操作流程图:操作步骤:
(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 个。
算法稳定性
相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。
相关文章推荐
- sdut oj 2404 super prime(素数筛)
- 删除vi编辑产生的.swp文件
- 快速排序
- jquery语法
- 架构大数据分析应用
- JAXB - Validate Document before It is Unmarshalled
- Long Short-Term Memory (LSTM)公式简介
- addEventListener和removeEventListener
- POJ 1696 Space Ant(极角排序)
- canvas 让你呼风唤雨,下雨下雪效果
- java工具类-排序介绍
- Java基础 - 1.1-Java 语言特性及其基本语法
- c++使用指针指向的字符串,如何判断字符串结束
- 快速幂
- 文本域与input窗口中 修改placeHolder 颜色
- 报错信息 The jsp:param action must not be used outside the jsp:include, jsp:forward, or jsp:params elements 的原因及解决办法
- Gradients渐变属性
- 在云服务器搭建WordPress博客(二)使用xampp并解决端口冲突问题
- [leetcode] 43. Multiply Strings
- 54.对称的二叉树