最近有同事去腾讯面试,其中一个排序算法题:从1亿个数字中取出最大的100个. 我感觉用位图排序是比较合适的.位图排序的特点是用内存空间换取CPU时间.代码如下:
import java.util.Random;
public class Top100 {
public static int[] getTop100(int[] inputArray) {
int maxValue = Integer.MIN_VALUE;
for (int i = 0; i < inputArray.length; ++i) {
if (maxValue < inputArray[i]) {
maxValue = inputArray[i];
}
}
byte[] bitmap = new byte[maxValue+1];
for (int i = 0; i < inputArray.length; ++i) {
int value=inputArray[i];
bitmap[value] = 1;
}
int[] result = new int[100];
int index = 0;
for (int i = maxValue; i >= 0 & index < 100; --i) {
if (bitmap[i] == 1) {
result[index++] = i;
}
}
return result;
}
public static void main(String[] args) {
int numberCount = 90000000;
int maxNumber = numberCount;
int inputArray[] = new int[numberCount];
Random random = new Random();
for (int i = 0; i < numberCount; ++i) {
inputArray[i] = Math.abs(random.nextInt(maxNumber));
}
System.out.println("Sort begin...");
long current = System.currentTimeMillis();
int[] result = Top100.getTop100(inputArray);
System.out.println(System.currentTimeMillis() - current);
for (int i = 0; i < result.length; ++i) {
System.out.print(result[i] + ",");
}
}
}
我的机子是配置是CPU:Intel(R) Pentium(R) M processor 1.60GHZ,512M内存. 运行结果如下
1千万:1.297秒
2千万: 2.906秒
3千万:4.578秒
4千万:6.203秒
5千万:7.875秒
6千万:9.953秒
7千万:11.407秒
8千万:26.921秒
9千万:31.953秒
当运行到1亿数据时,机子几乎就没有反应了,这可能是物理内存已经耗尽,用虚拟内存了.
欢迎交流!