快速排序(Java)

快速排序

算法思想:以军训排队为例,教官说以第一个同学为中心,比他矮的站他左边,比他高的站他右边,这就是一趟快速排序。因此,一趟快速排序是以一个枢轴,将序列分成两部分,枢轴的一边比它小(或小于等于),另一边比它大(或大于等于)。

代码:

public static int partition(int []array,int lo,int hi){
       //固定的切分方式
       int key=array[lo];
       while(lo<hi){
           while(array[hi]>=key&&hi>lo){//从后半部分向前扫描
               hi--;
           }
           array[lo]=array[hi];
           while(array[lo]<=key&&hi>lo){//从前半部分向后扫描
               lo++;
           }
           array[hi]=array[lo];
       }
       array[hi]=key;
       return hi;
   }
   
   public static void sort(int[] array,int lo ,int hi){
       if(lo>=hi){
           return ;
       }
       int index=partition(array,lo,hi);
       sort(array,lo,index-1);
       sort(array,index+1,hi); 
   }
    public static void main( String arg[])
    {
        int[] x = { 49, 38, 65, 13};
         sort(x,0,x.length-1);
        for(int i=0;i<x.length;i++){
        System.out.println(x[i]);
        }
      
    }

算法性能:快速排序最好情况下时间复杂度为O(nlogn),待排序列越接近无序,则该算法效率越高,在最坏情况下时间复杂度为O(n*n),待排序列越接近有序,则该算法效率越低,算法的平均时间复杂度为O(nlogn)。就平均时间而言,快速排序是所有排序算法中最好的。该算法的空间复杂度为O(logn),快速排序是递归进行的,需要栈的辅助,因此需要的辅助空间比前面几类排序方法要多。

快速排序的优化

对于基准位置的选取一般有三种方法:固定切分,随机切分和三取样切分。固定切分的效率并不是太好,随机切分是常用的一种切分,效率比较高,最坏情况下时间复杂度有可能为O(N2).对于三数取中选择基准点是最理想的一种。

快速排序在序列中元素很少时,效率将比较低,不然插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值