快速排序
快速排序
0 |
1 |
2 |
3 |
4 |
|
20 |
16 |
5 |
40 |
22 |
1.把低位设置为基准数 |
基准数20 |
|
|
|
|
循环执行条件是低位小于高位,低位为0,高位为4 |
20 |
16 |
5 |
40 |
22 |
从高位往低位找,若找到比基准数小的数,值赋给低位 |
20 |
16 |
5 |
40 |
22 |
|
20 |
16 |
5 |
40 |
22 |
|
5 |
16 |
5 |
40 |
22 |
交换完成后从低位开始找,若找到比基准数大的值,值赋给高位 |
5 |
16 |
5 |
40 |
22 |
|
5 |
16 |
5 |
40 |
22 |
此时低位等于高位,结束循环,此时低位指向数组的2下标 |
5 |
16 |
20 |
40 |
22 |
把基准数给低位 |
基准数5 |
|
|
|
|
|
5 |
16 |
20 |
40 |
22 |
递归调用自己,从数组起始位的位置到低位下标结束,执行条件还是低位小于高位,从高位往低位找,若找到比基准数小的数,值赋给低位 |
5 |
16 |
20 |
40 |
22 |
|
5 |
16 |
20 |
40 |
22 |
此时低位等于高位,结束循环,此时低位指向数组的0下标 |
5 |
16 |
20 |
40 |
22 |
把基准数给低位 |
基准数16 |
|
|
|
|
|
5 |
16 |
20 |
40 |
22 |
递归调用自己,从数组低位+1的位置到高位下标结束,执行条件是低位小于高位,从高位往低位找,若找到比基准数小的数,值赋给低位 |
5 |
16 |
20 |
40 |
22 |
|
5 |
16 |
20 |
40 |
22 |
|
5 |
16 |
20 |
40 |
22 |
此时低位等于高位,结束循环,此时低位指向数组的1下标 |
5 |
16 |
20 |
40 |
22 |
把基准数给低位 |
|
|
|
|
|
|
基准数20 |
|
|
|
|
|
5 |
16 |
20 |
40 |
22 |
递归调用自己,从数组低位+1的位置到高位下标结束,执行条件是低位小于高位,从高位往低位找,若找到比基准数小的数,值赋给低位 |
5 |
16 |
20 |
40 |
22 |
|
5 |
16 |
20 |
40 |
22 |
此时低位等于高位,结束循环,此时低位指向数组的2下标 |
5 |
16 |
20 |
40 |
22 |
把基准数给低位 |
基准数40 |
|
|
|
|
|
5 |
16 |
20 |
40 |
22 |
递归调用自己,从数组低位+1的位置到高位下标结束,执行条件是低位小于高位,从高位往低位找,若找到比基准数小的数,值赋给低位 |
5 |
16 |
20 |
22 |
22 |
|
5 |
16 |
20 |
22 |
22 |
此时低位等于高位,结束循环,此时低位指向数组的4下标 |
5 |
16 |
20 |
22 |
40 |
把基准数给低位 |
public static void main(String args[]) {
int[] arr = { 20, 16, 5, 40, 22 };
sortA(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.print(i + ",");
}
}
public static void sortA(int[] array, int low, int high) {
if (low < high) {
int lowIndex = low;
int higIndex = high;
int num = array[lowIndex];
while (lowIndex < higIndex) {
while (lowIndex < higIndex && array[higIndex] >= num) {
higIndex--;
}
if (lowIndex < higIndex) {
array[lowIndex] = array[higIndex];
}
while (lowIndex < higIndex && array[lowIndex] <= num) {
lowIndex++;
}
if (lowIndex < higIndex) {
array[higIndex] = array[lowIndex];
}
}
array[lowIndex] = num;
System.out.println(lowIndex);
sortA(array, low, lowIndex - 1);
sortA(array, lowIndex + 1, high);
}
}