查找中位数(java 快速排序)

来源:互联网 发布:国家质检总局网络培训 编辑:程序博客网 时间:2024/05/16 08:32

中位数(又称中值,英语: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

1 0
原创粉丝点击