快速排序

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

排序演示
假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。
此时,ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。
此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。
此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。
此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。
此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。
此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,ref成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序。

思路如下

一般左边第一个为基准数,从右边开始判断,先从右边检索比基准数小的,检索到了,停下,
在从左边检索比基准数大的,检索到了就停下,交换
一旦i和j相遇,停止检索,交换基数和相遇位置的数,第一轮结束
分别对基数左边 和 右边进行排序

private static void QKSort(int[] arr, int left, int right) {
        //检查安全性
        if (left>right){
            return;
        }

        int j =right;
        int i =left ;
        int base = arr[left];
        //一旦i和j相遇,停止检索,交换基数和相遇位置的数,第一轮结束
        while (i!=j){
            //先从右边检索比基准数小的,比基准数大就往左移动
            while (arr[j]>=base && i<j){
                j--; //从右往左移动
            }
            // 在从左边检索比基准数大的,比基准数大就往右移动
            while (arr[i]<= base && i< j){
                i++; //i 从左往右移动
            }
            swap(arr,i,j);
        }
        //一旦i和j相遇,停止检索,交换基数和相遇位置的数,第一轮结束
        arr[left]=arr[i];
        arr[i] = base;

        QKSort(arr,left,i-1);
        QKSort(arr,j+1,right);
    }
    // i的值 和 j的值 位置进行交换
    private static void swap(int[] array,int i,int j){
        int temp=array[i];
        array[i]=array[j];
        array[j]=temp;
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗罗的1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值