基本思路:
数组int[] nums 左边界left 右边界right (三个参数, 时间复杂度:[ NlogN ])
- 找一个基准数,一般以最左边的数作为基准数 base=nums[left]
- 右索引从右开始往左搜索,找到第一个比基准数小的数,暂停;左索引从左往右搜索第一个比基准数大的数,暂停;
交换两个数的位置; - 继续从右往左,从左往右寻找,然后继续交换,直到左右索引相遇,退出;
- 交换基准数和相遇位置的数,此时基准数左边的数全部小于等于基准数,右边的全部大于等于基准数
- 再对左右两边进行递归排序,求解
- 当左边界大于右边界时,退出
public void quickSort(int[] nums,int left,int right){
if(left>right){ //左边界大于右边界
return;
}
int base=nums[left]; // 以最左边的数作为基准数
int i=left,j=right; // 设置左右索引
while(i!=j){ // 循环交换右小左大的数,直到相遇
while(nums[j]>=base&&j>i){ // 找到右边第一个比基准数小的数
j--;
}
while(nums[i]<=base&&i<j){ //左边第一个比基准数大的数
i++;
}
int temp=nums[i]; // 交换右大左小的位置
nums[i]=nums[j];
nums[j]=temp;
}
nums[left]=nums[i]; // 交换基准数和相遇位置的数
nums[i]=base;
quickSort(nums,left,i-1); // 左边的全比基准数小,基准数右边的全比基准数大,递归求解左右两边
quickSort(nums,i+1,right);
}