• 图文演示 快速排序


    分治+挖坑法

    何谓挖坑法?我们来看一看详细过程。

    给定原始数列如下,要求从小到大排序:

    在这里插入图片描述

    首先,我们选定基准元素Pivot,并记住这个位置index,这个位置相当于一个“坑”。并且设置两个指针left和right,指向数列的最左和最右两个元素:

    在这里插入图片描述

    接下来,从right指针开始,把指针所指向的元素和基准元素做比较。如果比pivot大,则right指针向左移动;如果比pivot小,则把right所指向的元素填入坑中。

    在当前数列中,1<4,所以把1填入基准元素所在位置,也就是坑的位置。这时候,元素1本来所在的位置成为了新的坑。同时,left向右移动一位。

    在这里插入图片描述

    此时,left左边绿色的区域代表着小于基准元素的区域。

    接下来,我们切换到left指针进行比较。如果left指向的元素小于pivot,则left指针向右移动;如果元素大于pivot,则把left指向的元素填入坑中。

    在当前数列中,7>4,所以把7填入index的位置。这时候元素7本来的位置成为了新的坑。同时,right向左移动一位。

    在这里插入图片描述

    此时,right右边橙色的区域代表着大于基准元素的区域。

    下面按照刚才的思路继续排序:

    8>4,元素位置不变,right左移

    在这里插入图片描述

    2<4,用2来填坑,left右移,切换到left。

    在这里插入图片描述

    6>4,用6来填坑,right左移,切换到right。

    在这里插入图片描述

    3<4,用3来填坑,left右移,切换到left。
    在这里插入图片描述

    5>4,用5来填坑,right左移。这时候left和right重合在了同一位置。

    在这里插入图片描述

    这时候,把之前的pivot元素,也就是4放到index的位置。此时数列左边的元素都小于4,数列右边的元素都大于4,这一轮交换终告结束。
    在这里插入图片描述
    代码实现:

    public class Test09 {
    
        private static void printArr(int[] arr) {
            for (int anArr : arr) {
                System.out.print(anArr + " ");
            }
        }
    
        private static int partition(int[] arr, int left, int right) {
            int temp = arr[left];
            while (right > left) {
                // 先判断基准数和后面的数依次比较
                while (temp <= arr[right] && left < right) {
                    --right;
                }
                // 当基准数大于了 arr[right],则填坑
                if (left < right) {
                    arr[left] = arr[right];
                    ++left;
                }
                // 现在是 arr[right] 需要填坑了
                while (temp >= arr[left] && left < right) {
                    ++left;
                }
                if (left < right) {
                    arr[right] = arr[left];
                    --right;
                }
            }
            arr[left] = temp;
            return left;
        }
    
        private static void quickSort(int[] arr, int left, int right) {
            if (arr == null || left >= right || arr.length <= 1)
                return;
            int mid = partition(arr, left, right);
            quickSort(arr, left, mid);
            quickSort(arr, mid + 1, right);
        }
    
    
        public static void main(String[] args) {
            int[] arr = {6, 4, 3, 2, 7, 9, 1, 8, 5};
            quickSort(arr, 0, arr.length - 1);
            printArr(arr);
        }
    }
    
  • 相关阅读:
    jsp课程笔记(五) PreparedStatement与Statement在使用时的区别
    如何和软件项目客户打交道
    小米的成功你学不会
    photoshop cs3 字体 即时预览
    maxQ的使用
    HTML5的明天,局部有小雨
    项目如何开始:怎样和客户一起搞定需求
    从拼死拼活开发软件项目到远程遥控管理
    HttpUnit简介
    JUnit使用方法
  • 原文地址:https://www.cnblogs.com/InternetJava/p/12543212.html
Copyright © 2020-2023  润新知