/**
* @author zzw
* @create 2021/04/11-16:31
*/
//将一组数据分半,前面的都比中间的数小,后面的都比中间的大,然后在将前面的分半,后面的分半,重复
public class test {
public static void main(String[] args) {
int[] arr = {1, 4, 5, 67, 7, 3, 8, 6, 9, 44};
quickSort(arr, 0, 9);
//遍历输出
for (int i : arr) {
System.out.print(i+" ");
}
}
public static void quickSort(int[] arr, int L, int R) {
int i = L;
int j = R;
//⽀点
int pivot = arr[(L + R) / 2];
//左右两端进⾏扫描,只要两端还没有交替,就⼀直扫描
while (i <= j) {
//左边寻找直到⽐⽀点⼤的数
while (pivot > arr[i]) {
i++;
}
//右边寻找直到⽐⽀点⼩的数
while (pivot < arr[j]) {
j--;
}
//1.当我们分别找到了⽐⽀点⼤的数(左边)和⽐⽀点⼩的数(右边),将它们进⾏交换 ,执行完后接着 while 循环
//2.或者找不到,只找到一边,另一边因为i++循环最后会变成支点下标,就将最初支点和另一个值交换,执行完后接着 while 循环
//直到做左边i++和右边j--交替了,就退出 while 循环
if (i <= j) { //i=3,j=7 i=4,j=5
int temp = arr[i]; //67 7
arr[i] = arr[j]; //67=6 7=3
arr[j] = temp; //6=67 3=7
i++; j--; //将6和67交换了位置然后接着判断i的后一个和j的前一个 4,6. 将3和7交换了位置 5,4
}
}
//原:int[] arr = {1, 4, 5, 67, 7, 3, 8, 6, 9, 44};
//第一次if:1 4 5 6 7 3 8 69 9 44
//第二次if:1 4 5 6 3 7 8 69 9 44
//上⾯⼀个while保证了第⼀趟排序⽀点的左边⽐⽀点⼩,⽀点的右边⽐⽀点⼤了。
// “左边”再做排序,直到左边剩下⼀个数(递归出⼝) 递归重复上面的动作
if (L < j) { //第一次 0<4 ...
quickSort(arr, L, j);
}
//“右边”再做排序,直到右边剩下⼀个数(递归出⼝) 递归重复上面的动作
if (i < R) { //第一次 5<9 ...
quickSort(arr, i, R);
}
}
}
04--快速排序
最新推荐文章于 2022-10-06 17:14:47 发布