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] + " ");
            }
        }
    
    }
    
    
    
  • 相关阅读:
    HDU2732 Leapin' Lizards 网络流 最大流 SAP
    POJ1459 Power Network 网络流 最大流
    HDU3718 Similarity KM
    HDU3488 Tour KM
    HDU2853 Assignment KM
    HDU1507 Uncle Tom's Inherited Land* 二分图匹配 匈牙利算法 黑白染色
    POJ1469 COURSES 二分图匹配 匈牙利算法
    HDU4185 Oil Skimming 二分图匹配 匈牙利算法
    POJ3041 Asteroids 二分图匹配 匈牙利算法
    BZOJ2553 [BeiJing2011]禁忌 AC自动机 矩阵
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13785070.html
Copyright © 2011-2022 走看看