今天去面试遇到一道算法题,40亿整数乱序不重复的情况下,如何取它的中位数,要求时间复杂度为O(n)。
首先想到的是快排加二分查找的思想,取一个数进行partition之后确定它的绝对位置,就可以放弃少的一边的比较。
搜了一下发现有个QuickSelect算法,也一起放进来对比了。
最后仔细看了一下,QuickSelect算法其实就是快排加二分。。。一样的思路。
最后还有一种是用数组的,不过如果能用bitmap可以省下很多内存。同学说时间复杂度也是O(n),但是可能因为语言的关系,往数组存1花了很多时间。代码贴一下吧:
package cn.springmvc.test;
import java.util.Arrays;
import java.util.HashSet;
public class UserTest {
/**
* @param args
*/
public static void main(String args[]) {
HashSet<Integer> hashSet = new HashSet<Integer>();
int maxSize = 4000000;
int random = 10000000;
while(hashSet.size()<maxSize){
int x=(int)(Math.random() * random);
hashSet.add(x);
}
int[] arr = new int[maxSize];
int[] arr2 = new int[maxSize];
int[] arr3 = new int[maxSize];
int[] arr4 = new int[maxSize];
int max = 0;
Integer[] a =hashSet.toArray(new Integer[0]);
int aLength = a.length;
for(int i=0;i<aLength;i++){
arr[i]=a[i];
arr2[i]=a[i];
arr3[i]=a[i];
arr4[i]=a[i];
}
//数组算法
long before0 = System.currentTimeMillis();
for(