排序方法
快速排序
基本原理
(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);对右边的递归
}
};