面试常见算法之快排

#include <vector>
#include <iostream>

using namespace std;

// partition实现
int partition(vector<int>& nums, int left, int right)
{
	// 当数组只有一个元素时直接返回该元素index
	if (left == right)
		return left;

	// 简单地取第一个数作为pivot
	int pivot = nums[left];
	int lp = left + 1, rp = right;
	while (lp < rp)
	{
		//找到左起第一个>pivot的数
		while (nums[lp] <= pivot && lp < rp)
			++lp;
		//找到右起第一个<=pivot的数
		while (nums[rp] > pivot&& lp < rp)
			--rp;
		// 如果lp = rp 直接跳出循环
		if (lp == rp)
			break;
		// 互换nums[lp] 和 nums[rp]
		swap(nums[lp], nums[rp]);
		++lp;
		--rp;
	}
	if (nums[lp] <= pivot)
	{
		// 如果nums[lp] <= pivot
		// 令nums[left] = nums[lp]
		// 并将pivot放到nums[lp]中
		swap(nums[left], nums[lp]);
		return lp;
	}
	else
	{
		// 否则令nums[left] = nums[lp-1]
		// 并将pivot放到nums[lp-1]中
		swap(nums[left], nums[lp - 1]);
		return lp - 1;
	}
}

//对nums数组的[left, right]区间进行排序
void qsort(vector<int>& nums, int left, int right)
{
	if (left >= right)
		return;

	// 返回pivot index
	// pivot前面的数均<=pivot
	// pivot后面的数均>pivot
	int idx = partition(nums, left, right);
	// 对左边部分调用qsort
	qsort(nums, left, idx - 1);
	// 对右边部分调用qsort
	qsort(nums, idx + 1, right);
}

int main()
{
	vector<int> nums{ 5,3,2,4,1};
	qsort(nums, 0, nums.size() - 1);
	for (int num : nums)
		cout << num << " ";
	cout << endl;
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值