直接上代碼
public class Top1000 {
public static int N = 1000;
public static int LEN = 100000000;
public static int arrs[] = new int[LEN];
public static int result[] = new int[N];
public static int len = result.length;
public static int heapSize = len;
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < LEN; i++) {
arrs[i] = random.nextInt(Integer.MAX_VALUE);
}
//構(gòu)建初始堆
for (int i = 0; i < N; i++) {
result[i] = arrs[i];
}
//構(gòu)建小頂堆
long start = System.currentTimeMillis();
buildMinHeap();
for (int i = 0; i < N; i++) {
if (arrs[i] > result[0]) {
result[0] = arrs[i];
minHeap(0);
}
}
System.out.println(LEN + "個(gè)數(shù),求top" + N + ",耗時(shí)" + (System.currentTimeMillis() - start) + "毫秒");
print();
}
private static void print() {
for (int a : result) {
System.out.print(a + ",");
}
System.out.println();
}
/**
* 自底向上構(gòu)建小堆
*/
private static void buildMinHeap() {
int size = len / 2 - 1;
for (int i = size; i >= 0; i--) {
minHeap(i);
}
}
/**
* i節(jié)點(diǎn)為根及子樹是一個(gè)小堆
*
* @param i
*/
private static void minHeap(int i) {
int l = left(i);
int r = right(i);
int index = i;
if (l < heapSize && result[i] < result[index]) {
index = l;
}
if (r < heapSize && result[r] < result[index]) {
index = r;
}
if (index != i) {
int t = result[index];
result[index] = result[i];
//遞歸向下構(gòu)建堆
minHeap(index);
}
}
private static int left(int i) {
return 2 * i;
}
private static int right(int i) {
return 2 * i + 1;
}
}