快速排序由递归实现,每一次递归中确定好一个排好序的位置,然后切分,在确定好位置的左右两边元素递归排序。然后快速排序主要的部分就是分区函数,如果确定好排好序的位置,才能进行下一步的递归,但是发现有些分区函数的代码很复杂,于是记录一下一个比较好理解的partition代码:
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
shuffle(nums);
quickSort(nums,0,nums.size()-1);
return nums;
}
void quickSort(vector<int>& nums,int lo,int high){
if(lo>high){
return;
}
int par=partition(nums,lo,high);
quickSort(nums,lo,par-1);
quickSort(nums,par+1,high);
}
//以下是分区代码,不用过多注意边节处理,不然感觉陷于太多的细节里面了
int partition(vector<int>& nums,int lo,int high){
int pivot=nums[lo];
while(lo<high){
while(lo<high&&nums[high]>=pivot){
high--;
}
nums[lo]=nums[high];
while(lo<high&&nums[lo]<=pivot){
lo++;
}
nums[high]=nums[lo];
}
nums[lo]=pivot;
return lo;
}
void shuffle(vector<int>& nums){
srand((unsigned) time(NULL));
int n=nums.size();
for(int i=0;i<n;i++){
int r=i+rand()%(n-i);
swap(nums[i],nums[r]);
}
}
};