快速排序可以归结为“挖坑填坑法”。
首先选择一个基准值x(一般选择第一个值),然后用两个指针left指向左端,right指向右端。然后right向前移动,直到遇到nums[right]<x,便将此值赋值给nums[left],然后将left向后移动,遇到大于x的值便放到right的位置,再移动right……直到left==right,最后将x填到相遇处。
这样便完成了小于x的在x左边,大于x的在x右边的排序。然后再分别对左侧和右侧的数组执行这个算法。
public void quickSort(int[] nums,int left,int right){
int i = left;
int j = right;
if(i<j){
int x = nums[left];
while(i<j){
while(i<j && nums[j]>x){
j--;
}
if(i<j){
nums[i] = nums[j];
i++;
}
while(i<j && nums[i]<x){
i++;
}
if(i<j){
nums[j] = nums[i];
j--;
}
}
nums[i] = x;
quickSort(nums,left,i-1);
quickSort(nums,i+1,right);
}
}
平均时间复杂度:O(nlogn)
最好空间复杂度:O(logn),每一次都平分数组
最差时间复杂度:O(n),退化为冒泡
来源:CSDN
作者:DLC990319
链接:https://blog.csdn.net/DLC990319/article/details/104515598