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

 快速排序

 基本思想

快速排序又成为分区交换排序,是目前已知的实测平均速度最快的一种排序方法,它是对冒泡排序方法的一种改进。其基本思想是:通过一趟划分将要排序的序列分割成独立的三个部分,即左部、基准值、右部。其中左部的所有数据都比基准值小,右部的所有数据都比基准值大。然后再按此方法分别对左部和右部进行划分,整个排序过程通过递归进行。

操作方法

 操作流程图:


操作步骤:

(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 个。

算法稳定性

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值