package 排序算法;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
QuickSort quickSort = new QuickSort();
int[] intArr= {2,1};
int[] ints = quickSort.quickSort(intArr, 0, intArr.length - 1);//对数组的第一个元素到最后一个元素进行排序
}
private int[] quickSort(int[] arr, int left, int right) { //left = 0,right = arr.length-1
if (left < right) { //判断是否是该数组或者临时数组的最后一个元素
int partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1, right);
}
return arr;
}
private int partition(int[] arr, int left, int right) {
// 设定基准值(pivot)
int pivot = left;
int index = pivot + 1; //基准点的下一个元素下标
for (int i = index; i <= right; i++) { //基准点跟他右边的所有元素进行比较
if (arr[i] < arr[pivot]) { //将基准点放在他适合的位置,即左边的都是小于基准点的,右边的都是等于或者大于基准点的
swap(arr, i, index);
index++; //表示下一轮换位置从当前已经更换的位置开始
}
} //到这里第一轮的初始基准点已经到了正确的位置
System.out.printf(Arrays.toString(arr)); //为什么这里是已经排序好的
swap(arr, pivot, index - 1); //这里为什么还要跟自己交换位置呢 ,不是很理解,这里的arrdubug的时候看是没有排序的
return index - 1;
}
private void swap(int[] arr, int i, int j) { //
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
partition只是其中一个步骤
你不要孤立的看问题
位置交换那部分,以具体到单次partition的数部分,你的代码中取了每次partition的第一个数为标准
这时候定义一个指针index,从第二个数开始for循环搜索,
每当 当前数小于基准 ,做交换,index与 i 两个所指向的数交换,然后index++(以此为单次操作opr)
一直进行opr,一定能保证当我遍历完整个部分,小于基准的数都处于左边,大于等于基准的数都在部分的右边
画图表示就像一只蜘蛛在树枝上爬,看到小于它的虫子就吃掉,并前进,当碰到比它大的虫子,它就不动往后面观察有没有小虫子,如果有,就把面前的大虫子和在它后面的第一个小虫子位置对调,再把小虫子吃掉前进,这样蜘蛛吃掉的都是后面的小虫,大虫就都在它前面了
当蜘蛛当前位置小于等于树枝长度时,保持探索,否则停止
大概就这个意思,实在还不太懂可以去B站搜索左神左程云的算法课看看他讲排序的部分