快速排序
快排的时间复杂度为O(nlogn),它是原地排序,空间复杂度为O(1)。快速排序它的思想是每次按照一个基准(通常为待排序数组的第一个元素),将待排序数组划分成两个子数组,左边小于基准值,右边大于基准值。在对两个子数组重复上诉操作,直到子数组的长度为1。
快排流程
- 找到划分左右两个子数组的基准值放置的下标pivot,然后再对(left,pivot-1)和(pivot+1,right)这两个子数组进行快排。
- 递归结束条件:子数组的长度为<=1。
快排代码
寻找pivot下标
将右边小于pivot的换到左边,将左边大于pivot的换到右边。
int find_pivot(vector<int> & nums,int left,int right){
//左闭右闭
int pivot=nums[left];
while(left<right){
//从数组的右边开始,如果nums[right]大于pivot,递减right,直到nums[right]小于等于pivot,说明nums[right]应该放到左边
while( right> left && nums[right] >= pivot){
right--;
}
//将nums[right]换到左边
nums[left]=nums[right];
//从数组的左边开始,如果nums[left]小于pivot,递加left,直到nums[left]大于pivot,说明nums[left]应该放到右边
while(right>left && nums[left] <=pivot){
left++;
}
//将nums[left]换到右边
nums[right]=nums[left];
}
nums[left]=pivot;
return left;
}
递归快排
找pivot,然后对左右两边子数组进行快排。
void fastSort(vector<int>& nums,int left,int right){
if(right-left<1){
return ;
}
int pivot=find_pivot(nums,left,right);
fastSort(nums,left,pivot-1);
fastSort(nums,pivot+1,right);
}
快排入口函数
vector<int> sortArray(vector<int>& nums) {
//快速排序
fastSort(nums,0,nums.size()-1);
return nums;
}