17-快速排序

时间:2020-02-18 21:11:36   收藏:0   阅读:51

参考和引用了 白话经典算法系列之六——快速排序 的一些内容

1. 简单介绍

2. 思想

2.1 切分元素 arr[x]

2.2 切分方法 partition(arr, left, right)

2.3 基本思想

  1. 先从数组中选定一个切分元素作为基准数
  2. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
  3. 再对左右区间重复step2,直到各区间只有一个数

2.4 举例

技术分享图片

2.5 挖坑填数

挖坑填数过程详见文首所引用的那片文章

  1. i = left, j = right; 将基准数挖出而形成了第一个坑arr[i]
  2. j-- 由后向前找比基准数小的数,找到后挖出此数填入前面一个坑arr[i]中
  3. i++ 由前向后找比基准数大的数,找到后也挖出来填到前面一个坑arr[j]中
  4. 再重复执行step2,step3两步,直到i == j,将基准数填入a[i]中

3. 代码实现

public class QuickSortDemo {
    public static void main(String[] args) {
        int[] arr = {5, 9, 78, 0, 23, -567, 70, 42, -5, 36};
        quickSort(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    
    public static void quickSort(int[] arr, int left, int right) {
        // 分治
        if(left < right) {
            int x = partition(arr, left, right);
            quickSort(arr, left, x-1);
            quickSort(arr, x+1, right);
        }
    }
    
    /**
     * 递归调用切分方法完成子数组排序
     * @param arr 待排序数组
     * @param left 数组首元素索引
     * @param right 数组尾元素索引
     * @return 切分元素的最终存放位置
     */
    public static int partition(int[] arr, int left, int right) {
        int i = left;
        int j = right;
        int pivot = arr[i];
        
        while(i < j) {
            // 1. 从右向左找 小于 pivot的数来填arr[i]的坑
            while(i < j && arr[j] >= pivot)
                j--;
            if(i < j) {
                arr[i] = arr[j];
                i++;
            }
            // 2. 从左向右找 大于|等于 pivot的数来填arr[j]的坑
            while(i < j && arr[i] < pivot)
                i++;
            if(i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        
        // 退出时, i和j相遇; 该位置也是pivot在数组中的最终位置
        arr[i] = pivot;
        return i;
    }
}

原文:https://www.cnblogs.com/liujiaqi1101/p/12327610.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!