题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
解题思路:
将输入的数组先进行排序,然后寻找中位数。
下面代码使用的是直接选择排序的方法。
**
* Created by Administrator on 2017/4/14.
*/
public class Solution29 {
public static Object Median(Integer[] array){
if ((array.length)%2 != 0){
return array[(array.length-1)/2];
}else if (array.length%2 == 0){
int c = array.length/2;
return ((array[c-1]) + (array[c]))/2;
}
return 0;
}
public static void selectSort(Integer[] keys) //直接选择排序(升序)
{
System.out.println("直接选择排序(升序)");
for (int i=0; i<keys.length-1; i++) //n-1趟排序
{
int min=i;
for (int j=i+1; j<keys.length; j++) //每趟在从keys[i]开始的子序列中寻找最小元素
if (keys[j]<keys[min]) //(升序)
// if (keys[j]>keys[min]) //(降序)
min = j; //min记住本趟最小元素下标
System.out.print("第"+(i+1)+"趟,下标"+i+"~"+(keys.length-1)+",min="+min+",");
if (min!=i) //将本趟最小元素交换到前边
swap(keys, i, min);
print(keys);
}
System.out.println(Median(keys));
}
private static void swap(Integer[] keys, int i, int j) //交换keys[i]与keys[j]元素,i、j范围由调用者控制
{
int temp = keys[j];
keys[j] = keys[i];
keys[i] = temp;
}
public static void print(Object[] value){ //打印排序后的数组
for (Object obj : value){
System.out.print(obj == null ? "null" : " "+obj.toString());
}
System.out.println();
}
public static void main(String args[]){
Integer[] array = {5,2,4,6};
selectSort(array);
}
}
//输出:
//直接选择排序(升序)
// 第1趟,下标0~3,min=1, 2 5 4 6
// 第2趟,下标1~3,min=2, 2 4 5 6
// 第3趟,下标2~3,min=2, 2 4 5 6
// 默认取整了:
// 4
//
// Process finished with exit code 0