java快速查找中位数_用QuickSort快速查找中位数(median)

中位数(median)是一个排好序的元素中中间位置的元素,如果元素个数为偶数,则是中间两个元素的平均值。例如(3,1,5)的中位数是3,而

(2,1,3,5)的中位数是2.5。查找中位数属于Selection

Algorithms的一种。用快速排序可以做到每次divide之后,只需要conquer一个分支,时间复杂度为O(nlogn)。

为便于比较,以下代码包含quicksort的算法实现:

public static float findMedianByQuicksort(int[] A,int left,int right){

//if(right

// throw new IllegalArgumentException();

int rp = sortPivot(A,left,right);

int leftCnt = rp;

int rightCnt = A.length-rp-1;

if(A.length % 2 == 0) {

if(rightCnt == leftCnt+1){

if(right

return A[rp];

}else{

return (A[rp] + findMedianByQuicksort(A,rp+1,right))/2;

}

}else if(rightCnt+1==leftCnt){

if(rp-1

return A[rp];

}else{

return (findMedianByQuicksort(A,left,rp-1)+A[rp])/2;

}

}else if(rightCnt > leftCnt){

return findMedianByQuicksort(A,rp+1,right);

}else{

return findMedianByQuicksort(A,left,rp-1);

}

}else{

if(leftCnt==rightCnt){

return A[rp];

}else if(rightCnt > leftCnt){

return findMedianByQuicksort(A,rp+1,right);

}else{

return findMedianByQuicksort(A,left,rp-1);

}

}

}

public static void quickSort(int[] A,int left,int right){

if(right<=left)

return;

int rp = sortPivot(A,left,right);

quickSort(A,left,rp-1);

quickSort(A,rp+1,right);

}

private static int sortPivot(int[] A,int left,int right){

int pivot = A[left];

int lp=left+1;

int rp=right;

while(lp<=rp){//consider the "equal" case: e.g. [-4 0], -4 is pivot

for(;lp<=right;lp++){

if(A[lp]>pivot){

break;

}

}

for(;rp>=left+1;rp--){

if(A[rp]

break;

}

}

if(lp < rp){

//swap

int tmp = A[lp];

A[lp]=A[rp];

A[rp] = tmp;

lp++;

rp--;

}

}

//swap pivot with the rp's value

A[left]=A[rp];

A[rp] = pivot;

return rp;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值