java快速排序和步骤解析

在这里插入图片描述
快速排序的核心思想是分而治之,用于数组排序的时候,如果是按从小到大的排序方式
步骤一:取一个数A点作为参考点,,
步骤二:把数组中A点右边大于A的,都放到A点的左边,然后把A点左边大于等于A的放到A点的右边。得到的数组就是{n个小于AAL(数组的长度)-n-1个大于等于A}.
步骤三:这时候体现分而治之的时候了,以A点左边作为新的数组,重复步骤一和步骤er,以A点的右边作为新的数组,也进行步骤一和步骤二,一直递归。递归退出的条件就是子数组只有一个A点。
上面是理论,有点抽象,我来举个形象的。
上面的数组是一条街,街上有身高不等的人分别站在A-H点,此时你要从低到高排序。你选择A点作为突破口,以A点的数值8作为基准,如果可以的话,你直接把8放在一个左边都小于8,右边都大于等于8的位置,显然,我们肯定不知道这个位置在哪。但我们可以这样,先把8放在外面,现在A点空出来了,然后,我们从后街开始向前找,找到G点5比8小,把5放到A点,此时,G点就空出来了,如下图。
在这里插入图片描述
你从后街拉一个人过来,你肯定也要从前街拉一个人到后街去填那个坑。那我们就从前街找一个大于等于8的放到G点,D点就是我们要找的,把31放到G点。
在这里插入图片描述
重复进行轮回,从后街拉一个到前街,再从前街拉一个到后街。直到从前街来的和从后街来的相碰,碰撞点就把x值存放的位置。因为我们一直以x值作为参考点,所以左边(前街)的都是小于X的,右边(后街)的都是大于等于X
java代码实现,建议代码看完还要自己敲,这里涉及的逻辑有很多,可以很好的锻炼自己的逻辑能力。

package net.evecom;

/**
 * Created by 76549 on 2019-05-15.
 */
public class Sort {
    public static void quickSort(int[] arr, int begin, int end) {
        //递归退出的条件
        if (begin < end) {
            //x为临时存放值
            int x = arr[begin];
            int i = begin;
            int j = end;
            while (i < j) {
                //需要找到一个小于x的时候,退出当前j--循环
                while (i < j && x <= arr[j]) {
                    j--;
                }
                if (i < j) {
                    arr[i] = arr[j];
                    i++;
                }
                //需要找到一个大于等于x的时候,退出当前i++循环
                while (i < j && x > arr[i]) {
                    i++;
                }
                if (i < j) {
                    arr[j] = arr[i];
                    j--;
                }
            }
            arr[i] = x;
            quickSort(arr, begin, i - 1);
            quickSort(arr, i + 1, end);
        }
    }

    public static void main(String[] args) {
        int[] arr = new int[]{8, 1, 2, 31, 33, 33, 5, 9};
        quickSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
    }
}

得到的结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lkpklpk/article/details/90230207