中位数(median)是一个排好序的元素中中间位置的元素,如果元素个数为偶数,则是中间两个元素的平均值。例如(3,1,5)的中位数是3,而(2,1,3,5)的中位数是2.5。查找中位数属于Selection Algorithms的一种。用快速排序可以做到每次divide之后,只需要conquer一个分支,时间复杂度为O(nlogn)。
为便于比较,以下代码包含quicksort的算法实现:
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<rp+1){
return A[rp];
}else{
return (A[rp] + findMedianByQuicksort(A,rp+1,right))/2;
}
}else if(rightCnt+1==leftCnt){
if(rp-1<left){
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]<pivot){
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;
}