数组快速排序算法及实现

这篇博客详细介绍了快速排序算法的原理和实现过程,包括如何选取基准元素,如何通过左右指针调整数组,以及如何利用递归进行部分排序。文中还提到了一个优化技巧,即在寻找第K大元素时如何减少不必要的排序。代码示例采用C++实现,并在最后给出了运行示例。
摘要由CSDN通过智能技术生成

快速排序,本博客供自己学习记录使用,也欢迎大家一起讨论。 

介绍比较好的网站:快速排序算法 (biancheng.net)

里面有一些动图,我的代码也是借鉴他的。

快速排序的思想:假设数组nums长度为n,从数组中随机抽选择一个数,一般是最后一个数位置n-1,使用左指针left=0,右指针right=n-2,左指针往右走,遇到比nums[n-1]大的数停止,右指针往左走,遇到比nums[n-1]小的数停止,如果此时左指针小于右指针,则交换两指针处的值,并将左右指针推进一个,否则跳出循环,最后交换nums[left]和nums[n-1],

此时,nums[n-1]左边值均比他小,右边的值均比他大,但是此时左右两边是无序的,需要再递归进行排序左右部分,这里有个小技巧,如果题目中要求的是第K大的数,则当left==n-k时可以直接返回这个数,如果left<n-k,则可以只递归【left+1,right],可以省去绝大部分时间。

#include<bits/stdc++.h>

using namespace std;

class quicksort
{
public:
	void quick_sort(vector<int>&nums,int left,int right)
	{
		if (left >= right) return;
		int cur = onesort(nums, left, right);
		quick_sort(nums, left, cur - 1);
		quick_sort(nums, cur + 1, right);
	}

	int onesort(vector<int>&nums, int left, int right)
	{
		int begin = left;
		int end = right - 1;
		int rightnum = nums[right];
		while (1)
		{
			while (begin<=right&&nums[begin] < rightnum)
				++begin;
			while (end>=0&&nums[end] > rightnum)
				--end;
			if (begin >= end) break;
			swap(nums[begin], nums[end]);
			++begin;
			--end;
		}
		swap(nums[begin], nums[right]);
		return begin;

	}
};

int main()
{
	vector<int> nums{ 4,3,5,1,7,6 };
	quicksort qs;
	int n = nums.size();
	qs.quick_sort(nums, 0, n-1);

	for (int num : nums)
		cout << num << " ";
	cout << endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值