1.LC75:考察手撕快排
class Solution {
public void sortColors(int[] nums) {
quickSort(nums,0,nums.length-1);//这里是入口,传入数组的0索引和最后一个索引
}
//1.写一个交换方法
private void swap(int[]nums,int i,int j){
int tmp= nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
//2.写一个基于基准元素的分区方法
//最关键的一点:swap方法传入的是索引值,但是实际交换的是数组元素
private int partition(int[]nums,int left,int right){
//1.选取基准元素,这个是按你的喜好来,这里我们选择最右侧的元素为基准元素
int pivot = nums[right];//选定好了基准元素
int i = left-1;//这里是我们左指针
//快慢指针思想:只有右指针指向的值比pivot小,则移动左指针,让左指针和右指针交换元素
for(int j=left;j<right;j++){
//这里的j是右指针
//所以本题就是通过左右指针进行交换,从而实现pivot左侧的元素都比它小,pivot右侧的元素都比它大
if(nums[j]<pivot){
i++;
swap(nums,i,j);
}
}
swap(nums,i+1,right);
//在确保遍历完整个数组,且较小元素放置到左边后,让right这个代表pivot的索引放到i的右侧,原因是:截止到i,都是j在遍历中发现的比Pivot小的元素,那很显然,pivot就应该放在i的右边,这个方法找的是分区索引,那我们返回这个索引作为分区的标准
//将right放置到合适的位置
return i+1;//return的i+1本质就是pivot的值
}
//3.写一个辅助方法,递归调用
//4.sortColors的方法中调用辅助方法
public void quickSort(int[] nums,int left,int right){
if(left<right){
int pIndex = partition(nums,left,right);
quickSort(nums,left,pIndex-1);
quickSort(nums,pIndex+1,right);
}
}
}