Java 算法:随机化快速排序法

随机化快速排序法通过随机选取元素作为基准来优化排序过程,避免了完全有序数组导致的最坏情况,使得平均时间复杂度为O(nlogn)。尽管最坏情况仍为O(n^2),但实际发生概率极低。当遇到重复元素导致的不平衡问题,可以采用双路快速排序法来改善效率。
摘要由CSDN通过智能技术生成

由于当数组有序时,也就是快速排序法的最差情况下,每次选定的都是最左边的元素,而我们又希望能选择整个数组中间的位置元素,如果不能准确的定位中间位置的元素,我们可以利用随机选择一个元素,此时的利用随机选取的快速排序的期望值为nlogn。

import java.util.*;

public class QuickSort {

    // 对arr[l...r]部分进行partition操作
    // 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
    private static int partition(Comparable[] arr, int l, int r){

        // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot
        swap( arr, l , (int)(Math.random()*(r-l+1))+l );

        Comparable v = arr[l];

        int j = l; // arr[l+1...j] < v ; arr[j+1...i) > v
        for( int i = l + 1 ; i <= r ; i ++ ){
            if( arr[i].compareTo(v) < 0 ){
                j ++;
                swap(arr, j, i);
            }
        }
        swap(arr, l, j);

        return j;
    }

    // 递归使用快速排序,对arr[l...r]的范围进行排序
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值