顺序统计、中值 计算中位数

random-partition 

http://open.163.com/movie/2010/12/J/J/M6UTT5U0I_M756SE0JJ.html

随机选择算法获得第i小的中位数

代码:

public static void main(String[] args) {
        //[1, 5, 9, 12, 15, 16, 30, 45, 23, 20]
        int[] arr = {12,20,5,16,15,1,30,45,23,9};
        int i = randomized_select(arr, 0, arr.length - 1, 5);
        System.out.println("=========================");
        System.out.println(i);

    }
    public static int randomized_select(int[] arr,int p,int r,int i){
        if(p==r){
            return arr[p];
        }
        int q=partition(arr,p,r);
        int k=q-p+1;
        if(i==k){
            return arr[q];
        }else if(i<k){
            return randomized_select(arr,p,q-1,i);
        }else{
            return randomized_select(arr,q+1,r,i-k);
        }

    }
 
    public static int partition(int[] arr,int left,int right){
        int privo=arr[(right-left)/2+left];
        System.out.println(privo);
        //退出循环的条件 left>right
        while(left<=right){
            while(arr[left]<privo){
                left++;
            }
            while(arr[right]>privo){
                right--;
            }
            if(left<=right){
                swap(arr,left,right);
                System.out.println(Arrays.toString(arr));
                left++;
                right--;
            }
        }

        return left;
    }
    public static void swap(int[] arr,int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;

    }

猜你喜欢

转载自blog.csdn.net/u011243684/article/details/87932674
今日推荐