zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序的具体过程

    image

    代码演示分治排序的具体过程

    import java.util.Arrays;
    
    public class QuickSort {
        public static void sort(int a[], int left, int right) {
            System.out.println(Arrays.toString(a));
            int i, j, baseNum;
            if (left > right) {
                return;
            }
            i = left;
            j = right;
    
            baseNum = a[i]; // 用子表的第一个记录做基准
            System.out.println("基准数baseNum:"+baseNum);
            System.out.println("第一个坑a[i]:"+a[i]);
            while (i < j) { // 从表的两端交替向中间扫描
                System.out.println("=========while大循环条件  while (i < j) "+"i="+i+"j="+j+"===========");
                System.out.println("===从末尾处开始寻找比基准数小的数=====");
                //从末尾处开始寻找比基准数小的数
                //如果大于就继续向前寻找
                while (i < j && a[j] >= baseNum){
                    j--;
                    System.out.println("如果大于等于就继续向前寻找j--:"+j);
    
                }
                //如果找到了比基准数小的数
                System.out.println("如果找到了比基准数小的数");
                if (i < j){
                    System.out.println("i="+i+";j="+j+";i<j"+"&& a[j]:"+a[j]+" < baseNum");
                    System.out.println("将a[j]:"+a[j]+"填入到坑a[i]:"+a[i]+"中,然后在a[j]:"+a[j]+"上挖一个坑");
                    System.out.println("a["+i+"] = a["+j+"]");
                    a[i] = a[j];// 用比基准小的记录替换低位记录
                    System.out.println(Arrays.toString(a));
                    i++;
                    System.out.println("这个时候又从头部开始找比基准数大的=>i向后移动一个i++:"+i);
                }
    
                System.out.println("=====从开始处向后寻找比基准数大的数======");
                //此时开始从开始处向后寻找比基准数大的数
                while (i < j && a[i] < baseNum){
                    i++; //如果比基准数小就继续寻找
                    System.out.println("如果比基准数小就继续寻找,i=:"+i);
                }
                //如果找到了比基准数大的数
                System.out.println("如果找到了比基准数大的数");
                if (i < j){// 用比基准大的记录替换高位记录
                    System.out.println("i="+i+";j="+j+";i<j"+"&& a[i]:"+a[i]+" > baseNum");
                    System.out.println("将a[i]:"+a[i]+"填入到上一个坑a[j]:"+a[j]+"中,然后在a[i]:"+a[i]+"上挖一个坑");
                    a[j] = a[i];
                    System.out.println("a["+j+"] = a["+i+"]");
                    System.out.println(Arrays.toString(a));
                    j--;
                    System.out.println("这个时候又从后面往前面找比基准数小的,j向前移动一步j--:"+j);
                }
    
            }
            a[i] = baseNum;// 将基准数值替换回 a[i]
            sort(a, left, i - 1); // 对低子表进行递归排序
            sort(a, i + 1, right); // 对高子表进行递归排序
    
        }
    
        public static void quickSort(int a[]) {
            sort(a, 0, a.length - 1);
        }
    
        public static void main(String[] args) {
    
            int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
            quickSort(a);
            System.out.println(Arrays.toString(a));
        }
    
    }
    
    
    
    [49, 38, 65, 97, 76, 13, 27, 49]
    基准数baseNum:49
    第一个坑a[i]49
    =========while大循环条件  while (i < j) i=0j=7===========
    ===从末尾处开始寻找比基准数小的数=====
    如果大于等于就继续向前寻找j--:j=6;i=0
    如果找到了比基准数小的数
    i=0;j=6;i<j&& a[j]:27 < baseNum
    将a[j]27复制到坑a[i]49,然后在原来的:27上挖一个坑
    a[0] = a[6]
    [27, 38, 65, 97, 76, 13, 27, 49]
    这个时候又从头部开始找比基准数大的=>i向后移动一个i++:1
    =====从开始处向后寻找比基准数大的数======
    如果比基准数小就继续寻找,i=:2
    如果找到了比基准数大的数
    i=2;j=6;i<j&& a[i]:65 > baseNum
    将a[i]:65复制到上一个坑a[j]:27,然后在原来的:65上挖一个坑
    a[6] = a[2]
    [27, 38, 65, 97, 76, 13, 65, 49]
    这个时候又从后面往前面找比基准数小的,j向前移动一步j--5
    =========while大循环条件  while (i < j) i=2j=5===========
    ===从末尾处开始寻找比基准数小的数=====
    如果找到了比基准数小的数
    i=2;j=5;i<j&& a[j]:13 < baseNum
    将a[j]13复制到坑a[i]65,然后在原来的:13上挖一个坑
    a[2] = a[5]
    [27, 38, 13, 97, 76, 13, 65, 49]
    这个时候又从头部开始找比基准数大的=>i向后移动一个i++:3
    =====从开始处向后寻找比基准数大的数======
    如果找到了比基准数大的数
    i=3;j=5;i<j&& a[i]:97 > baseNum
    将a[i]:97复制到上一个坑a[j]:13,然后在原来的:97上挖一个坑
    a[5] = a[3]
    [27, 38, 13, 97, 76, 97, 65, 49]
    这个时候又从后面往前面找比基准数小的,j向前移动一步j--4
    =========while大循环条件  while (i < j) i=3j=4===========
    ===从末尾处开始寻找比基准数小的数=====
    如果大于等于就继续向前寻找j--:j=3;i=3
    如果找到了比基准数小的数
    =====从开始处向后寻找比基准数大的数======
    如果找到了比基准数大的数
    i不小于j 或者i=j
    将基准数替换回a[i]
    [27, 38, 13, 49, 76, 97, 65, 49]
    ---对低子表进行递归排序---
    [27, 38, 13, 49, 76, 97, 65, 49]
    基准数baseNum:27
    第一个坑a[i]27
    =========while大循环条件  while (i < j) i=0j=2===========
    ===从末尾处开始寻找比基准数小的数=====
    如果找到了比基准数小的数
    i=0;j=2;i<j&& a[j]:13 < baseNum
    将a[j]13复制到坑a[i]27,然后在原来的:13上挖一个坑
    a[0] = a[2]
    [13, 38, 13, 49, 76, 97, 65, 49]
    这个时候又从头部开始找比基准数大的=>i向后移动一个i++:1
    =====从开始处向后寻找比基准数大的数======
    如果找到了比基准数大的数
    i=1;j=2;i<j&& a[i]:38 > baseNum
    将a[i]:38复制到上一个坑a[j]:13,然后在原来的:38上挖一个坑
    a[2] = a[1]
    [13, 38, 38, 49, 76, 97, 65, 49]
    这个时候又从后面往前面找比基准数小的,j向前移动一步j--1
    i不小于j 或者i=j
    将基准数替换回a[i]
    [13, 27, 38, 49, 76, 97, 65, 49]
    ---对低子表进行递归排序---
    [13, 27, 38, 49, 76, 97, 65, 49]
    ---对高子表进行递归排序---
    [13, 27, 38, 49, 76, 97, 65, 49]
    ---对高子表进行递归排序---
    [13, 27, 38, 49, 76, 97, 65, 49]
    基准数baseNum:76
    第一个坑a[i]76
    =========while大循环条件  while (i < j) i=4j=7===========
    ===从末尾处开始寻找比基准数小的数=====
    如果找到了比基准数小的数
    i=4;j=7;i<j&& a[j]:49 < baseNum
    将a[j]49复制到坑a[i]76,然后在原来的:49上挖一个坑
    a[4] = a[7]
    [13, 27, 38, 49, 49, 97, 65, 49]
    这个时候又从头部开始找比基准数大的=>i向后移动一个i++:5
    =====从开始处向后寻找比基准数大的数======
    如果找到了比基准数大的数
    i=5;j=7;i<j&& a[i]:97 > baseNum
    将a[i]:97复制到上一个坑a[j]:49,然后在原来的:97上挖一个坑
    a[7] = a[5]
    [13, 27, 38, 49, 49, 97, 65, 97]
    这个时候又从后面往前面找比基准数小的,j向前移动一步j--6
    =========while大循环条件  while (i < j) i=5j=6===========
    ===从末尾处开始寻找比基准数小的数=====
    如果找到了比基准数小的数
    i=5;j=6;i<j&& a[j]:65 < baseNum
    将a[j]65复制到坑a[i]97,然后在原来的:65上挖一个坑
    a[5] = a[6]
    [13, 27, 38, 49, 49, 65, 65, 97]
    这个时候又从头部开始找比基准数大的=>i向后移动一个i++:6
    =====从开始处向后寻找比基准数大的数======
    如果找到了比基准数大的数
    i不小于j 或者i=j
    将基准数替换回a[i]
    [13, 27, 38, 49, 49, 65, 76, 97]
    ---对低子表进行递归排序---
    [13, 27, 38, 49, 49, 65, 76, 97]
    基准数baseNum:49
    第一个坑a[i]49
    =========while大循环条件  while (i < j) i=4j=5===========
    ===从末尾处开始寻找比基准数小的数=====
    如果大于等于就继续向前寻找j--:j=4;i=4
    如果找到了比基准数小的数
    =====从开始处向后寻找比基准数大的数======
    如果找到了比基准数大的数
    i不小于j 或者i=j
    将基准数替换回a[i]
    [13, 27, 38, 49, 49, 65, 76, 97]
    ---对低子表进行递归排序---
    [13, 27, 38, 49, 49, 65, 76, 97]
    ---对高子表进行递归排序---
    [13, 27, 38, 49, 49, 65, 76, 97]
    ---对高子表进行递归排序---
    [13, 27, 38, 49, 49, 65, 76, 97]
    [13, 27, 38, 49, 49, 65, 76, 97]
    
    Process finished with exit code 0
    
    

    简洁代码

    import java.util.Arrays;
    
    public class QuickSort1 {
        public static void sort(int a[], int left, int right) {
            int i, j, baseNum;
            if (left > right) {
                return;
            }
            i = left;
            j = right;
            baseNum = a[i]; // 用子表的第一个记录做基准
            while (i < j) { // 从表的两端交替向中间扫描
                while (i < j && a[j] >= baseNum){
                    j--;
                }
                if (i < j){
                    a[i] = a[j];// 用比基准小的记录替换低位记录
                    i++;
                }
                while (i < j && a[i] < baseNum){
                    i++;
                }
                if (i < j) {
                    a[j] = a[i];// 用比基准大的记录替换高位记录
                    j--;
                }
                    
            }
            a[i] = baseNum;// 将基准数值替换回 a[i]
            sort(a, left, i - 1); // 对低子表进行递归排序
            sort(a, i + 1, right); // 对高子表进行递归排序
    
        }
    
        public static void quickSort(int a[]) {
            sort(a, 0, a.length - 1);
        }
    
        public static void main(String[] args) {
    
            int a[] = { 49, 38, 65, 97, 76, 13, 27, 49 };
            quickSort(a);
            System.out.println(Arrays.toString(a));
        }
    
    }
    
    

    参考博客

    白话经典算法系列之六 快速排序 快速搞定

    【排序算法】快速排序原理及Java实现

  • 相关阅读:
    vue 添加对象的新属性的方法
    vue 简单的c3属性写法
    大数据分析技术生态圈一览
    网络
    Axis2 WebService客户端Axis2调用
    前端资源
    不错的数据库
    dubbo
    大数据相关
    This is very likely to create a memory leak 异常
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10493218.html
Copyright © 2011-2022 走看看