快速排序:将序列划分成两个部分,前一部分的值都小于后一部分,然后递归的调用两部分序列进行排序,一分二,二分四;关键是如何划分;
我们定义函数 randomized_quicksort(nums, l, r) 为对 nums 数组里
[l,r] 的部分进行排序,每次先调用 randomized_partition(nums,l,r) 函数对 nums 数组里
[l,r] 的部分进行划分,并返回分界值的下标 pos,然后按上述将的递归调用 randomized_quicksort(nums, l, pos - 1) 和 randomized_quicksort(nums, pos + 1, r) 即可。
关键在于划分函数的实现:选定一个值(数组里任意一个值),大于它的在一组,小于他的在另一组,其实挺简单的,为了方便我们都选取序列最后一个元素作为选定值;
class Solution {
public:
int partition(vector<int>&nums,int l,int r)
{
int povit=nums[r];
int i=l-1;
int j=l;
for(j=l;j<r;j++)
{
if(nums[j]<povit)
{
i++;
swap(nums[i],nums[j]);
}
}
swap(nums[i+1],nums[r]);
return i+1;
}
int partition_random(vector<int>&nums,int l,int r)
{
int i=rand()%(r - l + 1) + l;
swap(nums[r],nums[i]);
return partition(nums,l,r);
}
void sort_quick(vector<int>&nums,int l,int r)
{
if(l<r)
{
int pos=partition_random(nums,l,r);
sort_quick(nums,l,pos-1);
sort_quick(nums,pos,r);
}
}
vector<int> sortArray(vector<int>& nums) {
srand((unsigned)time(NULL));
sort_quick(nums,0,nums.size()-1);
return nums;
}
};