快速排序

手写快速排序:

package com.atguigu.react2024;


import java.util.Arrays;

public class QuicklySort {

    public static void main(String[] args) {
        int[] arr = {9, 5, 8, 7, 2, 3, 6,3, 4, 1, 10};
        quickSort(arr, 0, arr.length - 1);
//        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 逻辑:会先把这个数组中的一个数当作基准数,一般会把数组的最左边的数当作基准数。
     * 然后从两边进行检索。先从右边检索比基数小的,再从左边检索比基数大的。
     * 如果检索到了,就停下,然后交换两个元素。然后再继续下去。
     * @param arr
     * @param left
     * @param right
     */

    public static void quickSort(int[] arr, int left, int right) {

        //如果左边索引比右边索引大,是不合法,直接返回
        if (left > right) {
            return;
        }

        //保存基准数
        int base = arr[left];
        //定义变量i,指向最左边
        int i = left;
        //定义变量j,指向最右边
        int j = right;

        //当i和j不相遇的时候,在循环中进行检索
        while (i != j) {
            //向由j从右往左检索比基准数小的,如果检索到比基准数小的就停止;
            //如果检索到比基准数大的或相等的,就继续检索
            while (arr[j] >= base && i < j) {
                j--;//j从右往左移动
            }

            //i从左往右检索
            while (arr[i] <= base && j > i) {
                i++;//i从左往右移动
            }

            //代码走到这里,i停下,j也停下,然后交换i和j位置的元素
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;

        }

        //如果上面的while循环的条件不成立,会跳出这个循环,往下执行
        //如果这个条件不成立说明i和j相遇了;如果i和j相遇了,就交换基准数这个元素和相遇位置的元素
        //把相遇位置的元素赋值给基准数这个位置的元素
        arr[left] = arr[i];
        //把基准数赋值给相遇位置的元素
        arr[i] = base;

        //基准数在这里就归位了,左边的数都比它小,右边的数都比它大
        //排基数的左边
        quickSort(arr, left, i - 1);
        //排基数的右边
        quickSort(arr, j + 1, right);

    }
}

 

posted @ 2024-04-13 22:21  odada  阅读(16)  评论(0)    收藏  举报