中位數(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;
}