快速排序

快速排序

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

  • 快速排序的核心是在数组中任意选定一个值作为标志位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] + " ");
        }
    }

}


posted @ 2020-10-09 12:22  DiiD  阅读(396)  评论(0编辑  收藏  举报