zoukankan      html  css  js  c++  java
  • 图文演示 快速排序

    分治+挖坑法

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

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

    在这里插入图片描述

    首先,我们选定基准元素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);
        }
    }
    
  • 相关阅读:
    Ruby 集合数组常用遍历方法
    Git,Github和Gitlab简介和基本使用
    L1-Day14
    学习进度(2)
    求数组的子数组的最大值(文件存储)
    开学第一课博客——自我介绍
    求数组的子数组的最大值
    学习进度(1)
    java web+模板
    android开发环境配置以及测试所遇到的的问题
  • 原文地址:https://www.cnblogs.com/InternetJava/p/12543212.html
Copyright © 2011-2022 走看看