【Java】十大排序算法之快速排序

快速排序

原数组:72 6 57 88 60 42 83 73 48 85


第一步:取第一个数 72 为基准数


第二步:右往左取得第一个小于基准数的数 索引 j 的值 48 (j = 8),将基准数的位置看做空位,将 48 插入空位
48(插入) 6 57 88 60 42 83 73 48(变空位) 85


第三步:左往右取得第一个大于基准数的数 索引 i 的值 88 (i = 3),将原先 48 的位置看做空位,将 88 插入空位
48 6 57 88(变空位) 60 42 83 73 88(插入) 85


第四步:右往左取得第二个小于基准数的数 索引 j 的值 42 (j = 5),将原先 88 的位置看做空位,将 42 插入空位
48 6 57 42(插入) 60 42(变空位) 83 73 88 85


第五步:左往右第二个大于基准数的数 索引 i 的值 83 (i = 6)索引 j 的值 42 (j = 5)大了,i >= j 不用操作,直接将 j = 5 即空位赋值基准数 72 即可
48 6 57 42 60 72(基数插入) 83 73 88 85


第六步(和第一步一样):取第一个数 48 为基准数


第七步:右往左取得第一个小于基准数的数 索引 j 的值 42 (j = 3),将基准数的位置看做空位,将 42 插入空位
42(插入) 6 57 42(变空位) 60 72 73 83 88 85


第八步:左往右取得第一个大于基准数的数 索引 i 的值 57 (i = 2),将原先 42 的位置看做空位,将 57 插入空位
42 6 57(变空位) 57(插入) 60 72 73 83 85 88


第九步:右往左第二个小于基准数的数 索引 j 的值 6 (j = 1)索引 i 的值 57 (i = 2)小了,i >= j 不用操作,直接将 i = 2 即空位赋值基准数 48 即可
42 6 48(基数插入) 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 即可
6 42(基数插入) 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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值