快速排序步骤图
package com.test;
public class QuickSort {
public static void main(String[] args) {
int numbers[] = { 3, 7, 5, 1, 67, 9, 2, 34, 12, 45 };
quickSort1(numbers, 0, 9);
quickSort2(numbers, 0, 9);
}
//=====快速排序=====
//1将第一个数存入一个临时变量,作为基准数,
//2从后往前找一个比基准数小的数(记住该数的位置,我们用R表示),将该数的值放入基准数位置
//3再从左往右找一个比基准数大的值(记住该数的位置,我们用L表示),将该数的值放入上一步所所获得的R的位置
//4重复第二步和第三步
//最后L=R,结束该次循环,此时将基准数放入L(或者R,此时L=R)位置。这时基准数左边的数都比基准数小,右边的数都比基准数大。
//把基准数左边的数看作一个新的数组,重复1,2,3,4 步骤,把基准数右边的数看作一个新的数组,重复1,2,3,4。(递归)
// 3 7 5 1 67 9 2 34 12 45 (最初数组)
// L R
// 3 7 5 1 67 9 2 34 12 45 0 9
// 2 7 5 1 67 9 2 34 12 45 0 6
// 2 7 5 1 67 9 7 34 12 45 1 6
// 2 1 5 1 67 9 7 34 12 45 1 3
// 2 1 5 5 67 9 7 34 12 45 2 3
// 2 1 5 5 67 9 7 34 12 45 2 2
// 2 1 5 5 67 9 7 34 12 45 2 2
// 2 1 3 5 67 9 7 34 12 45 2 2(第一次二分结束,以3为中心分成左右两个数组)
private static void quickSort1(int[] numbers, int l, int r) {
int start = l; // 用来存放未排序数组的开始位置
int end = r; // 用来存放未排序数组的结束位置
if (l >= r) return; // 循环递归结束的条件
int temp = numbers[l];
while (l < r) { //循环目的:将数组划分,temp左边都比temp小,temp右边都比temp大
while (l < r) { //循环目的:从右边找到一个比temp小的数 ,用r记录这个数的下标
// temp < numbers[r]加不加等号的意义,是否把等于temp的数看作时小于temp的数(加等号代表看作比temp大的数,不加等号代表看作小于temp的数)
if (temp < numbers[r]) {
r -= 1;
} else {
break;
}
}
numbers[l] = numbers[r]; //将找的数放到
while (l < r) { //循环目的:从左边找到一个比temp大的数,用l记录这个数的下标
if ( temp > numbers[l] ) {
l += 1;
} else {
break;
}
}
numbers[r] = numbers[l];
}
numbers[l] = temp;
quickSort1(numbers, start, l - 1);
quickSort1(numbers, l + 1, end);
}
//代码简化版
private static void quickSort2(int[] numbers,int l,int r) {
int start=l;
int end=r;
if (l >= r) return;
int key = numbers[l];
while (l<r) {
while (l < r && key <= numbers[r]) r -= 1;
numbers[l]=numbers[r];
while (l < r && key >= numbers[l]) l += 1;
numbers[r] = numbers[l];
}
numbers[l]=key;
quickSort2(numbers, start, l - 1);
quickSort2(numbers, l + 1, end);
}
}