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

    快速排序

    同样采用了分治的思想,但是不同于归并中分解时出现的大小相等的子数组,快速排序分解出来的两个数组长度不一样相等。但在合并过程中也是类似的,同样是有序的数组的合并,不同的是不再是两个子数组之间的排序,而是两数组内部的重排。

    • 快速排序的核心是在数组中任意选定一个值作为标志位x,小于标志的的数组元素放在数组左侧,大于标志的数组元素放在右侧。保证左侧的数组都是小于x,右侧的数组都是大于x。但是分解的过程其实也就是在合并。因为此时得到的数组算是部分有序的。
    • 对两个数组同样需要进行类似的操作,依次递归。最后得到就是完整的数组

    2020/8/15 目前还是没有特别理解,以后有新的理解继续补上

    快速排序demo

    package Sort;
    
    import java.io.BufferedInputStream;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class QuickSort {
        static Scanner sc = new Scanner(new BufferedInputStream(System.in));
        final static int  N = (int) 1e6 + 10;
    
        /**
         * 交换数组中的所用
         *
         * @param arr - 输入数组
         * @param i - 第一个数的索引
         * @param j - 第二个数的索引
         */
        public static void swap(int[] arr, int i, int j){
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    
        /**
         * 快速排序的具体实现
         *
         * @param arr - 待排序数组
         * @param l - 左边界
         * @param r - 右边界
         */
        public static void quickSort(int[] arr, int l, int r){
    
            // 终止条件
            if (l >= r) return;
            // 方便下面地使用
            int i = l - 1;
            int j = r + 1;
    
            // 先进行分治,选择合适的位置,一般为中点。
            // 双指针指向,在原数组中划分出两个数组。结束之后,部分有序
            int flag = arr[(i + j ) >> 1];
            while (i < j){
                do i++; while (arr[i] < flag);
                do j--; while (arr[j] > flag);
                if (i < j) swap(arr, i ,j);
            }
    
            //开始分治
            quickSort(arr, l, j);
            quickSort(arr, j + 1, r);
        }
    
        public static void  main(String[] args){
            int n = sc.nextInt();
            int[] arr = new int[N];
            for(int i = 0; i < n; i++){
                arr[i] = sc.nextInt();
            }
    
            quickSort(arr, 0, n - 1);
    
            for (int i = 0; i < n; i++) {
                System.out.print(arr[i] + " ");
            }
        }
    
    }
    
    
    
  • 相关阅读:
    区别@ControllerAdvice 和@RestControllerAdvice
    Cannot determine embedded database driver class for database type NONE
    使用HttpClient 发送 GET、POST、PUT、Delete请求及文件上传
    Markdown语法笔记
    Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    Mysql 查看连接数,状态 最大并发数(赞)
    OncePerRequestFilter的作用
    java连接MySql数据库 zeroDateTimeBehavior
    Intellij IDEA 安装lombok及使用详解
    ps -ef |grep xxx 输出的具体含义
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13785070.html
Copyright © 2011-2022 走看看