排序方法(快排)

排序方法

快速排序

基本原理

(1) 选择基准值。
(2) 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
(3) 对这两个子数组进行快速排序。
在这里插入图片描述
以33为基准
在这里插入图片描述以10为基准
在这里插入图片描述
最后排序完成7,10,15,33

代码实现

class solution
{
	void quicksort(vector<int>& arr,int left,int right)//注意arr引用
	{
		if(left>=right)
		{
			return;
		}
		int l=left,r=right;//每一次大的while循环结束后left和right的值会变
		int pivot=arr[left];//选择最左边的数为基准
		while(l<r)
		{
		    while(l<r && arr[r]>=pivot)r--;/*这里一定是right先走;
		    以最左边的数为基准right就从最右边先走;
		    相反以最右边的数为基准就left从最左边先走;
		    因为选取最左边的值为基准值,左边指针遇到比基准值大的停下来,
		    右边指针遇到比基准值小的停下来,
		    所以首先走右边指针,这样一轮大的while循环
		    结束的最后一步肯定是停在比当前pivot小的值上面*/
	   		while(l<r && arr[l]<=pivot)l++;
			if(l<r)swap(arr[l],arr[r]);//注意判断l<r
		}
		arr[left]=arr[l];//此时arr[l]=arr[r]
		arr[l]=pivot;//发现一次大的while循环过后arr[left]总是等于pivot,所以这里也可以直接swap(arr[l],arr[left])
		quicksort(arr,left,l-1);对左边的递归
		quicksort(arr,l+1,right);对右边的递归
	}	
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值