排序算法之快速排序

一、基本思想

在算法中,分治是一种非常常见的方法,它将一个问题分成两个独立的子问题,子问题的规模相对较小,然后不断的递归下去最终解决问题,快速排序就是这样一个例子。

快速排序由C.A.R.Hoare发明,其大致思想是选择一个元素作为中枢值,将其插入到数组中合适位置,使得该元素前面的所有元素比它小,该元素后面的所有元素比它大,这样就将数组划分为两个子集,然后递归执行即可。

快速排序包含两个基本步骤:首先数组根据中枢值分成两个部分,左边元素小于等于中枢值,右边元素都大于中枢值;然后每个部分被递归的排序。


二、算法实现

void qSort(int* a, int left, int right) {
	if (left >= right) {
		return;
	}
	int zsv = a[left]; // 选取第一个元素为中枢值
	int last = left, temp;
	for (int p = left + 1; p <= right; p++) {
		if (a[p] < zsv) {
			++last;
			temp = a[p], a[p] = a[last], a[last] = temp;
		}
	}
	a[left] = a[last], a[last] = zsv;

	// 递归
	qSort(a, left, last - 1);
	qSort(a, last + 1, right);
}

// 快速排序算法
void quickSort(int *a, int len) {
	qSort(a, 0, len - 1);
}

三、算法分析

快速排序的时间复杂度为O(nlog2(n)). 

快速排序算法在递归的每一步中大数组切分成两个小数组,如果其中一个集合为空,则快速排序会退化成一个二次方算法。因此,中枢值的选取对算法效率的影响非常关键。

通常关于 中枢值的选择必须是高效的,不应该需要检查数组中所有元素:
  • 选择第一个或者最后一个元素;
  • 在数值中随机选择一个元素;
  • 选择k中值:在A[left,left+n-1]随机选择k个元素,然后选择这k个元素的中值,通常k=3.

四、算法优化

快速排序算法的优化策略主要有:
  • 消除递归;
  • 选择基于三中值分区的中枢值;
  • 设定一个切分数组长度的最小值,如果小于这个值就直接使用插入排序;
  • ...


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值