查詢中位數(java 快速排序)
阿新 • • 發佈:2019-02-20
中位數(又稱中值,英語:Median),統計學中的專有名詞,代表一個樣本、種群或概率分佈中的一個數值,其可將數值集合劃分為相等的上下兩部分。對於有限的數集,可以通過把所有觀察值高低排序後找出正中間的一個作為中位數。如果觀察值有偶數個,通常取最中間的兩個數值的平均數作為中位數。
java程式碼:
import java.util.*;
/**
* @version 1.0
* @author zhouxiaowu
*
*/
public class MedianFinder {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("please input some numbers:");
String str = sc.nextLine();
String[] s = str.split("\\s+");
int[] num= new int[s.length];
for(int i=0;i<s.length;i++){
num[i]=Integer.parseInt(s[i]);
}
double med=medianFinder(num);
System.out.println("median is :" +med);
}
public static double medianFinder(int[] num){
int mid;
int len=num.length;
double med;
if(len%2==0){
mid=len/2;
med=(select(num,mid)+select(num,mid-1))/2.0;
}
else{
mid=(len-1)/2;
med=(double)select(num,mid);
}
return med;
}
public static int select(int[] num,int k){
int low=0;
int high=num.length-1;
int j=0;
int val=0;
while(low<high){
j=partition(num,low,high);
if(j==k){
val=num[j];
break;
}else if(j>k){
high=j-1;
}else{
low=j+1;
}
}
return val;
}
public static int partition(int[] num,int low,int high){
int i=low;
int j=high;
int temp=num[i];
while(i<j){
while(i<j && temp<=num[j])
j--;
if(i<j)
num[i++]=num[j];
while(i<j && temp>=num[i])
i++;
if(i<j)
num[j--]=num[i];
}
num[i]=temp;
return i;
}
}
測試結果:
input:4 6 8 1 9 7 5
output:median is :6.0
input:4 3 6 1 9 6
output:median is :5.0