Java 快速排序

Java Quicksort

public class QuickSort {

    /**
     * 将数据按照基准数自大小进行左右划分
     *
     * @param a
     * @param start
     * @param end
     * @return
     */
    public static int divide(int[] a, int start, int end){

        //便利每次都以最右边的元素作为基准值
        int base = a[end];//第一循环 6
        //start一旦等于end,就说明左右两个指针合并到了同一位置,可以结束此轮循环。
        while(start < end){
            while(start < end && a[start] <= base)
                //从左边开始遍历,如果比基准值小,就继续向右走,寻找左边第一个大于基准值的数与基准值做调换
                start++;
            //上面的while循环结束时,就说明当前的a[start]的值比基准值大,应与基准值进行交换
            //第一循环 左边第二位时候7比6大 循环节点 start右移动一位 {2,7,4,5,10,1,9,3,8,6}
            if(start < end){
                //交换
                int temp = a[start];
                a[start] = a[end];
                a[end] = temp;
                //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值右边),因此右边也要同时向前移动一位
                end--;
                //第一循环 {2,6,4,5,10,1,9,3,8,7}  开始右边比对{4,5,10,1,9,3,8}与6的大小,找比6小的做交换
            }
            while(start < end && a[end] >= base)//第一循环 start=1 end=8 8>6?
                //从右边开始遍历,如果比基准值大,就继续向左走
                end--;
            //上面的while循环结束时,就说明当前的a[end]的值比基准值小,应与基准值进行交换
            //第一循环 end=7时 a[end]=3 循环结束
            if(start < end){
                //交换
                int temp = a[start];
                a[start] = a[end];
                a[end] = temp;
                //交换后,此时的那个被调换的值也同时调到了正确的位置(基准值左边),因此左边也要同时向后移动一位
                //开始6与3交换 {2,3,4,5,10,1,9,6,8,7}
                start++;
            }

        }
        //这里返回start或者end皆可,此时的start和end都为基准值所在的位置,即基准值在中间的时候。
        return end;
    }

    /**
     * 排序
     * @param a
     * @param start
     * @param end
     */
    public static void sort(int[] a, int start, int end) {
        if (start > end) {
            //start=end 一个元素,结束循环
            return;
        } else {
            //如果不止一个元素,继续划分两边递归排序下去
            int partition = divide(a, start, end);
            sort(a, start, partition - 1);
            sort(a, partition + 1, end);
        }

    }

    public static void main(String[] args) {

        int[] a = new int[]{2,7,4,5,10,1,9,3,8,6};
        sort(a, 0, a.length-1);
        System.out.println("排序后的结果:");
        for(int x : a){
            System.out.print(x+" ");
        }


    }


https://arxiv.org/pdf/1511.01138.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值