排序算法之快速排序

快速排序

思路

  1. 选出最左边或者最右边的位置作为这一轮的key值
  2. 定义最左边的begin和最右边的end,在begin<=end的前提下,end从右往左走直到遇到数比key值小,begin从左往右走直到遇到数比key值大(若选择最左边作为key则需要end先走,若选择最右边作为key则需要begin先走)
  3. 交换begin和end位置上的值,再次按照步骤2中规则走下去直到begin和end相遇,这个时候将key值与相遇点的值交换,这个时候相遇点左边的值都比key小,右边都比key大
  4. 将相遇点左边和右边的子序列按照前面的规则再继续执行直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,此时此部分已有序

代码实现

void QuickSock(int* arr, int begin, int end)
{
	if (begin >= end)return;
	int left = begin;
	int right = end;
	int keyi = begin;
	while (begin < end)
	{
		while (arr[end] >= arr[keyi] && begin < end)
		{
			--end;
		}

		while (arr[begin] <= arr[keyi] && begin < end)
		{
			++begin;
		}

		int imp = arr[end];
		arr[end] = arr[begin];
		arr[begin] = imp;
	}

	int imp = arr[keyi];
	arr[keyi] = arr[end];
	arr[end] = imp;

	keyi = end;
	QuickSock(arr, left, keyi - 1);
	QuickSock(arr, keyi + 1, right);
}

时间复杂度分析

在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(n²),平均时间复杂度为O(nlog₂n)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值