快速排序(quickSort)

思想:设置一个基准数,基准数的左边的数都小于他,右边的数都大于他

快速排序_快速排序

过程原理:
快速排序_数组_02

1.选择数组中第一个数为基准数

2.设置左右两个节点,分别从最左端、最右端开始往中间靠拢,在这个过程中,如果左节点的数值大于基准数,就停在这个位置上;右节点的数值小于基准数,也停在这个位置上;将这两个数进行交换,然后继续照这样比下去,直至左右节点相遇。

3.当左右节点相遇后,需要将基准数赋值到这个位置上,至此基准数就放在中间。

4.递归调用这个快排方法,把左半部分和右半部分排出来

参考代码:

package com.iweb.ssm.domain;

import java.util.Arrays;

public class Test {
    /**
     * quickSort需要三个参数:1.一个数组。2.左起始下标left=0。3.右起始下标right=数组长度-1
     */
    public static void quickSort(int[] arr, int left, int right) {
        //如果左起始下标大于右起始下标就返回。意味着左右节点已经碰头了
        if (left > right) return;
        int i, j,base,temp;
        /**
         * i是左节点,j是右节点,base作为基准数,temp是交换时的中间变量
         */
        i = left;
        j = right;
        base = arr[left];

        while (i<j){//如果左节点小于右节点,说明左右节点还没有相遇,可以进行比较交换
            /**
             * 先看右边,
             * 如果右节点下标的数值大于等于基准数,且右节点下标大于左节点下标
             * 依次往左递减
             */
            while (arr[j]>=base && j>i){
                j--;
            }

            /**
             * 再看左边,
             * 如果左节点下标的数值小于等于基准数,且左节点下标小于右节点下标
             * 依次往左递增
             */
            while (arr[i]<=base && i<j){
                i++;
            }
            //如果满足左节点的数值大于基准数,右节点的数值小于基准数,就交换位置
            if (i<j){
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
            }
        }
        /**
         * 以上代码执行完后,说明左右节点已经相遇了
         * 现在需要把基准数的值,赋值给相遇的这个位置,i或j都可以
         */
        arr[left] = arr[i];
        arr[i] = base;

        //递归调用左边数组,这里是从left位置开始,到j(相遇的位置)的前一个位置,进行比较交换
        //所以是j-1
        quickSort(arr,left,j-1);

        //递归调用右边数组,这里是从相遇的位置的后一个位置开始(j+1),到right,进行比较交换
        quickSort(arr,j+1,right);
    }

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