排序|快速排序初次实现

著名的排序算法,说是冒泡排序的强化版,刚开始的时候我倒是没看出来和冒泡排序有什么联系,后来想了一想,确实如此,本质上还是非常接近的,都是不断的把最小的数往前移,把最大的数往后放,而且用的都是两数交换的方式。

而且这个算法也是分治法的一种体现。

刚开始我觉得很难理解,但是后来多想了一会儿,就发现其实也没有那么复杂,实现原理还是很简单的,思考出这个算法才是真正难得地方。

基本上照着黑马教程思路实现的,还是需要多思考,提高能力。

public class Quicksort {
    public static void main(String[] args) {
        int[] arr = {-7,6,1,4,3,2,1};
        Qsort(arr);
        String s = Arrays.toString(arr);
        System.out.println(s);
    }
    static void Qsort(int[]arr){
        int lo = 0;
        int hi = arr.length-1;
        sort(arr,lo,hi);
    }
    static void sort(int[]arr,int lo,int hi){
        //排序方法----把数组中的数同第一个元素比较大小,大的放左边,小的放右边
        if(lo >= hi) {
            return;
        }
            int partition = partition(arr,lo,hi);
            sort(arr,lo,partition - 1);
            sort(arr,partition + 1,hi);
    }

    /**
     * 这个方法是排序的核心
     * @param arr
     * @return
     */
    private static int partition(int[] arr,int lo,int hi) {
        int right = hi + 1;//把指针向右边放一个是为了下面可以正常循环起来
        int left = lo;
        int i = arr[lo];
        while (true) {

            //通过遍历指针得到小于枢轴的元素下标
            //因为是指针,所以不用把之前比较过的数再次比较
            while (arr[--right] > i){
                if(right == lo){
                    break;
                }
            }
            while (arr[++left] < i){
                if(left == hi){
                    break;
                }
            }

            //结束判定
            if(left >= right){
                break;
            }else {
                //进行一次交换,一定要记住逻辑顺序,是先判定,后交换,交换是有条件的
                exchange(arr,right,left);
            }
        }
        exchange(arr,right,lo);
        return right;
    }
    static void exchange(int[]arr,int right,int left){
        int temp;
        temp = arr[right];
        arr[right] = arr[left];
        arr[left] = temp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值