第二篇:快速排序

一、概念

	通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

时间复杂度:O(nlog2^n)
空间复杂度:O(log2^n)
稳定性:不稳定

二、算法描述

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

三、伪代码实现(中间值为基准值)

public class Main{
    /**
    * 比较类排序:快排
    */
    public static void quickSort(int num[], int l, int r){
        int i = l;
        int j = r;
        //1.取中间值为基准值
        //2.只有当两个指针交叉后才算一趟快排完毕,所以当i == j时,还需要比较一次,num ={1, 2, 3, 5, 8, 4, 7}就是一个例子
        while(i <= j){
            //3.从左边开始找比基准值大的索引
            //4.从右边开始找比基准值小的索引
            //5.找到一个大于基准值、一个小于基准值的索引后,并且两个索引还没有交叉,可以相等
            if(i <= j){
                //6.交换两个的值,左边指针指向下一个,右边指针指向前一个
            }
        }
        //这时的(l~j)的数组小于或者等于基准值和(i~r)的数组大于或者等于基准值(通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所				有数据都比另外一部分的所有数据都要小)
        //7.if(l<j)递归快排(l~j)的数组
        //8.if(i<r)递归快排(i~r)的数组
    }
}

四、代码实现(中间值为基准值)

public class Main{
    /**
    * 比较类排序:快排
    */
    public static void quickSort(int num[], int l, int r){
        int i = l;
        int j = r;
        //1.取中间值为基准值
        int mid = num[l + (r - l)/2];
        while(i <= j){
            //3.从左边开始找比基准值大的索引
            while(num[i] < mid){
                i++;
            }
            //4.从右边开始找比基准值小的索引
            while(num[j] > mid){
                j --;
            }
            if(i <= j){
                //6.交换两个的值,并且左边指针指向下一个,右边指针指向前一个
                int temp = num[i];
                num[i] = num[j];
                num[j] = temp;
                i ++;
                j --;
            }
        }
        //不能提取下面的方式 例子:4568789
        //if(i == j){
        //    i ++;
        //    j --;
        //}
        //这时的(l~j)的数组小于等于基准值和(i~r)的数组大于等于基准值
        //7.if(l<j)递归快排(l~j)的数组
        if (l <= j) {
            quickSort(num, l, j);
        }
        //8.if(i<r)递归快排(i~r)的数组
        if (i <= r) {
            quickSort(num, i, r);
        }
    }
}

五、代码实现(任意基准值实现)

六、快排优化

https://www.cnblogs.com/noKing/archive/2017/11/29/7922397.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值