快速排序
原数组:72 6 57 88 60 42 83 73 48 85
第一步:取第一个数
72
为基准数
第二步:右往左取得第一个小于基准数的数
索引 j 的值 48 (j = 8)
,将基准数的位置看做空位,将48
插入空位
48(插入)
6 57 88 60 42 83 7348(变空位)
85
第三步:左往右取得第一个大于基准数的数
索引 i 的值 88 (i = 3)
,将原先48
的位置看做空位,将88
插入空位
48 6 5788(变空位)
60 42 83 7388(插入)
85
第四步:右往左取得第二个小于基准数的数
索引 j 的值 42 (j = 5)
,将原先88
的位置看做空位,将42
插入空位
48 6 5742(插入)
6042(变空位)
83 73 88 85
第五步:左往右第二个大于基准数的数
索引 i 的值 83 (i = 6)
比索引 j 的值 42 (j = 5)
大了,i >= j
不用操作,直接将j = 5
即空位赋值基准数72
即可
48 6 57 42 6072(基数插入)
83 73 88 85
第六步(和第一步一样):取第一个数
48
为基准数
第七步:右往左取得第一个小于基准数的数
索引 j 的值 42 (j = 3)
,将基准数的位置看做空位,将42
插入空位
42(插入)
6 5742(变空位)
60 72 73 83 88 85
第八步:左往右取得第一个大于基准数的数
索引 i 的值 57 (i = 2)
,将原先42
的位置看做空位,将57
插入空位
42 657(变空位)
57(插入)
60 72 73 83 85 88
第九步:右往左第二个小于基准数的数
索引 j 的值 6 (j = 1)
比索引 i 的值 57 (i = 2)
小了,i >= j
不用操作,直接将i = 2
即空位赋值基准数48
即可
42 648(基数插入)
57 60 72 73 83 85 88
第十步(和第一步一样):取第一个数
42
为基准数
第十一步:右往左取得第一个小于基准数的数
索引 j 的值 6 (j = 0)
,将基准数的位置看做空位,将42
插入空位
6(插入)
6(变空位)
48 57 60 72 73 83 85 88
第十二步:左往右第一个大于基准数的数
索引 i 的值 48 (i = 2)
比索引 j 的值 6 (j = 0)
大了,i >= j
不用操作,直接将j = 0
即空位赋值基准数42
即可
642(基数插入)
48 57 60 72 73 83 85 88
import java.util.Arrays;
public class QuickSortTest {
public static void main(String[] args) {
int[] arr = {72, 6, 57, 88, 60, 42, 83, 73, 48, 85, 1};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
// 判断左右向中靠拢是否在同个位置,不在同个位置则继续交换
if (left < right) {
int i = left;
int j = right;
// 指定一个基准数
int flag = arr[left];
// 每次循环左索引i变大,右索引j变小,直到两者相等退出循环
while (i < j) {
// 右向左走(如果值大于等于基准数则右索引减一,则到找到小于的为止)
while (i < j && arr[j] >= flag) {
j--;
}
// 第一次循环基准数的位置相当于是个空位,将比基准数小的数据放入,之后左索引加一
if (i < j) {
arr[i++] = arr[j];
}
// 左向右走(如果值小于基准数则左索引加一,则到找到大于的为止)
while (i < j && arr[i] < flag) {
i++;
}
// 将比基准数大的数放入,之后右索引减一
if (i < j) {
arr[j--] = arr[i];
}
}
// 循环过后i和j的值是一样的,用 arr[j] = flag 也是一样的效果,这个就是将基准值放到正确的位置,基准值处理好之后就处理两边的
arr[i] = flag;
// 左边的[左索引(left)][右索引(i-1),用 j-1 也是同样的效果],
quickSort(arr, left, i - 1);
// 右边的[左索引(i+1),用 j+1 也是同样的效果][右索引(right)]
quickSort(arr, i + 1, right);
}
}
}