快速排序

给定无序的数组,进行排序。


分析:

(1)快速排序是一种快速的分治算法,之所以快是因为非常紧凑而又高度优化的内部循环。

(2)最佳情况运行时间O(NlogN),最坏情况运行时间O(N的平方),平均情况运行时间O(NlogN)。

(3)通过选择任意元素,称为支点,分割成为两个互不相交的组,然后递归进行分割排序。

(4)通常选择中间元素((low+high)/2)作为支点,也可以选择三个元素的中值分割,第一,中间和最后元素。

算法[O(NlogN)]:

    public void quickSort(int[] a) {

        quickSort(a, 0, a,length-1) ;

    }

    public void quickSort(int[] a, int low, int high) {

        int middle = (low+high)/2 ;

        //对第一、中间、最后三个元素进行排序

        if( a[middle].compareTo(a[low]) < 0 )

            swap(a, low, middle) ;

        if( a[high].compareTo(a[low] < 0))

            awap(a, low, high) ;

        if( a[high].compareTo(a[middle]) < 0)

            awap(a, high, middle) ;

        swap(a, middle, high -1 ) ;        //把中间元素与倒数第二交换

        int pivot = a[high - 1] ;        

        int i, j ;

        for( i=low,j=high-1; ; ) {

            while( a[++i].compareTo(pivot) < 0)        //从前开始查找小于中间元素的位置

                ;

            while( a[--j].compareTo(pivot) > 0)        //从后开始查找大于中间元素的位置

                ;

            if( i>=j )

                break ;

            swap(a, i, j) ;        //把大小两个元素交换

        }

        swap( a, i , high-1 ) ;        //把放到后面的元素换回中间

        //递归排序两个子数组

        quickSort(a, low, i-1) ;    

        quickSort(a, i+1, high) ;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值