• 快速排序


    快速排序

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

    • 快速排序的核心是在数组中任意选定一个值作为标志位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] + " ");
            }
        }
    
    }
    
    
    
  • 相关阅读:
    python学习之计算机基础详解
    python学习笔记-day03
    名称空间与作用域
    函数参数的应用
    day14
    day13
    函数的基本使用
    day12
    day 09
    文件操作
  • 原文地址:https://www.cnblogs.com/Di-iD/p/13785070.html
Copyright © 2020-2023  润新知