【Java 实现 快速排序】

package com.wangxiaohu;

import java.util.Arrays;

/**
 * 快速排序算法
 */
public class SortQuick {


    public static void main(String[] args) {
        int[] nums = new int[]{4, 1, 6, 3, 2, 5};
        System.out.println(Arrays.stream(nums).sum());
        sortQuick(nums);
        System.out.println(Arrays.stream(nums).iterator().next());
    }


    /**
     * 快速排序主函数
     *
     * @param nums
     */
    public static void sortQuick(int[] nums) {
//        Arrays.sort(nums,0,nums.length-1);
        sort(nums, 0, nums.length - 1);
    }

    /**
     * 快速排序核心逻辑
     *
     * @param nums
     * @param lo
     * @param hi
     */
    private static void sort(int[] nums, int lo, int hi) {
        //1. base case
        if (lo >= hi) {
            return;
        }

        // 2. 获取分界点索引p
        int p = partition(nums, lo, hi);

        // 3.分别递归处理分界点左右数组
        // 先递归处理左
        sort(nums, lo, p - 1);
        // 再递归处理右
        sort(nums, p + 1, hi);
    }

    private static int partition(int[] nums, int lo, int hi) {
        if (lo == hi) return lo;
        // 将 nums[lo] 作为默认分界点 pivot
        int pivot = nums[lo];
        // j = hi + 1 因为 while 中会先执行 --
        int i = lo, j = hi + 1;
        while (true) {
            // 保证 nums[lo..i] 都小于 pivot
            while (nums[++i] < pivot) {
                if (i == hi) break;
            }
            // 保证 nums[j..hi] 都大于 pivot
            while (nums[--j] > pivot) {
                if (j == lo) break;
            }
            if (i >= j) break;
            // 如果走到这里,一定有:
            // nums[i] > pivot && nums[j] < pivot
            // 所以需要交换 nums[i] 和 nums[j],
            // 保证 nums[lo..i] < pivot < nums[j..hi]
            swap(nums, i, j);
        }
        // 将 pivot 值交换到正确的位置
        swap(nums, j, lo);
        // 现在 nums[lo..j-1] < nums[j] < nums[j+1..hi]
        return j;
    }

    private static void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值