快速排序算法(排序详解)

来源:互联网 发布: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 个。

算法稳定性

相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。

0 0
原创粉丝点击