数据结构--快速排序

1.基本思想

1.1 先从数列中取出一个数作为基准数

1.2 分区过程,将比这个数大的全放在右边,小的放在左边(分区)

1.3 再对左右分区重复第一,二步,直到各区间只有一个数(递归)

2.物理实现

public class QuickSort {
    public static void quckSort(int[] array) {
        int low = 0;
        int high = array.length - 1;
        quickSort(array, low, high);
    }

    private static void quickSort(int[] array, int low, int high) {//???递归何时结束
        if (low < high) {
            //分区操作,将一个数组分成两个分区,返回分区界限索引
            int index = partition(array, low, high);
            //对左分区进行快速排序
            quickSort(array, low, index - 1);
            //对右分区进行快速排序
            quickSort(array, index + 1, high);
        }
    }

    private static int partition(int[] array, int low, int high) {
        //指定左指针i和右指针j
        int i = low;
        int j = high;
        //将第一个数作为,基准数(挖坑)
        int x = array[low];
        //使用循环实现分区操作
        while (i < j) {
            //从右向左移动j,找到第一个小于基准数的值array[j]
            while (array[j] >= x && i < j) {
                j--;
            }
            //将右侧找到小于基准数的值加入到左边的坑中,左指针向中间移动一位i++
            if (i < j) {
                array[i] = array[j];
                i++;
            }
            //从左向右移动i,找到第一个大于等基准数的值array[i]
            while (array[i] <= x && i < j) {
                i++;
            }
            //将左侧找到大于基准数的值加入到右边的坑中,右指针向中间移动一位j--
            if (i < j) {
                array[j] = array[i];
                j--;
            }
        }

        //使用基准值填坑,这就是基准值的最终位置
        array[i] = x;
        //返回基准值的索引
        return i;
    }

main

public static void main(String[] args) {
    //创造一个无序数组
    int[] array = {72, 57, 9, 6, 12, 45, 85, 41, 55, 45, 99, 77};
    //输出该无序数组
    System.out.println(Arrays.toString(array));
    //快速排序
    quckSort(array);
    //输出有序数组
    System.out.println(Arrays.toString(array));
}

结果

[72, 57, 9, 6, 12, 45, 85, 41, 55, 45, 99, 77]
[6, 9, 12, 41, 45, 45, 55, 57, 72, 77, 85, 99]
posted @ 2020-10-10 23:34  深陈  阅读(151)  评论(0)    收藏  举报