排序算法之快速排序

快速排序

最差时间复杂度\Theta(n^2)
最优时间复杂度\Theta(n\log n)
平均时间复杂度\Theta(n\log n)
最差空间复杂度根据实现的方式不同而不同

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。——快速排序.维基百科


(图片引自维基百科)

个人理解的快速排序算法:欲对序列data[]作快速排序,1)将data[]的第一个元素(上图为最后一个元素)存为key;2)通过赋值,一轮调整将所有小于key的元素调整至key的左边,将所有大于key的元素调整至key的右边;3)用递归的方法分别对key左边与右边的子序列作快速排序;4)函数出口为:子序列最多只有一个元素。

函数代码:

/*
 *	快速排序
 */
void QuickSort(int data[], int low, int high)
{	/* 快速排序data[low..high) */
	/* 每一轮对序列的调整,使得所有大于第一个元素key的元素位于key的右边, */
	/*		以及所有小于key的元素位于key左边 */
	/* 最后分别对key左右两边的子序列作快速排序 */

	if (high - low < 2)
	{/* 单元素区间 */
		return;
	}
	
	int key = data[low];	/* 保存第一个元素 */
	int i = low, j = high - 1;

	while (i < j)
	{
		while (i < j && key <= data[j])
		{	/* 逆序寻找小于key的元素 */
			j--;
		}
		if (i < j)
		{	/* 将小于key的元素调整至key左边 */
			data[i++] = data[j];
		}
		while (i < j && data[i] <= key)
		{	/* 顺序寻找大于key的元素 */
			i++;
		}
		if (i < j)
		{	/* 将大于key的元素调整至key右边 */
			data[j--] = data[i];
		}
	}//while (i < j)
	data[i] = key;	/* 将key置于正确位置 */

	QuickSort(data, low, i);
	QuickSort(data, i + 1, high);
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值