• 快速排序


    快速排序

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

    • 快速排序的核心是在数组中任意选定一个值作为标志位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] + " ");
            }
        }
    
    }
    
    
    
  • 相关阅读:
    linux下SVN迁移
    hive-site.xml
    5.扩展 GROUP BY
    4.锁——避免重复启动同一程序
    1.执行计划探究(一)
    1.日期_星期
    3.放弃CHAR吧,在铸成大错之前!
    2.NULL 的问题
    1.ORACLE 尽量不使用隐式转换
    webservice
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13785070.html
Copyright © 2020-2023  润新知