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

来源:互联网 发布:matlab求海森矩阵 编辑:程序博客网 时间:2024/05/16 10:38

昨天了解了快速排序的基本思路,并对一组无序数列进行了快速排序,今天将学习用快速排序编写一段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。

1 0
原创粉丝点击