Java程序员必备-数据结构与算法之快速排序(二)

昨天了解了快速排序的基本思路,并对一组无序数列进行了快速排序,今天将学习用快速排序编写一段java程序,这也是学习算法的根本目的,就是解决一个问题,下面标出代码:

    public void change(Object[] r,int low,int high){
        int temp = r[low];
        while(low < high){

            while(low < high && strategy.compare(r[high],temp) >= 0 ) high--;
            r[low] = r[high];
            while(low < high && strategy.compare(r[low],temp) <= 0 ) low++;
            r[high] = r[low];
        }
        r[low] = temp;
        return low;
    }
    public void quickSort(Object[] r,int low,int high){
        if(low < high){
            int p = change(r,low,high);
            change(r,low,p-1);
            change(r,p+1,high);
        }
    }

快速排序的复杂度分析:

1.时间复杂度

快速排序算法的运行时间依赖于划分是否平衡,根据基准数元素将序列划分为两个子序列中的元素个数,而划分是否平衡还依赖于所使用的枢纽元素。
最坏情况:所得到的子序列中一个子序列为空,相当于冒泡排序,每一次都有一个元素在一边,n-1的元素在另一边,此时的时间复杂度为o(n的平方)。
最好情况:每次排序的基准数恰巧在中间,恰巧左侧和右侧的元素一样多,此时的时间复杂度公式则为:T[n] = 2T[n/2] + f(n),T[n/2]为平分后的子数组的时间复杂度,f[n] 为平分这个数组时所花的时间,下面为最优情况下的时间复杂度分析:

这里写图片描述
参考自:http://blog.csdn.net/yuzhihui_no1/article/details/44198701,在此表示感谢!!

2.空间复杂度

快速排序算法需要一个堆栈来实现递归,若每次划分都将序列均匀分隔为长度相近的两个子序列,则堆栈的最大深度为log n,但是,最坏情况下,堆栈的最大深度则是n。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值