类似百度热点搜索。堆排序。
多数据集(下面构造三个数据集合,没了再取),取极值(前十名)
java.util.ArrayList<Integer> arrayListFirst = new java.util.ArrayList<Integer>();
arrayListFirst.add(1);
arrayListFirst.add(21);
arrayListFirst.add(31);
java.util.ArrayList<Integer> arrayListSecond = new java.util.ArrayList<Integer>();
arrayListSecond.add(5);
arrayListSecond.add(25);
arrayListSecond.add(35);
java.util.ArrayList<Integer> arrayListThird = new java.util.ArrayList<Integer>();
arrayListThird.add(3);
arrayListThird.add(23);
arrayListThird.add(33);
采用堆存储楼上所有数据,一一获取极值;,某一数据源没了,也就是到了指定数据索引个数,即要重新读取(按极值读取)
HeapArray heapArray = new HeapArray();
for(int i=0;i<3;i++){
heapArray.add(arrayListFirst.get(i), 1, i+1);
heapArray.add(arrayListSecond.get(i), 2, i+1);
heapArray.add(arrayListThird.get(i), 3, i+1);
}
heapArray.doPrintln();
while(true){
HeapArray.HeapEntry heapEntry = heapArray.getMin();
System.out.println("拿出最小:"+heapEntry.value+" "+heapArray.size);
if(heapEntry.indexData == 3){
System.out.println("数据源已拿光,请重新读取入堆,数据源:"+heapEntry.indexDataSource);
}
}
改造堆的entry,其他跟堆操作一样。即堆的fixup与fixdown
public class HeapArray {
HeapEntry[] heapArray;
int DEFAULT_HEAPARRAY_LENGTH = 128;
int size = 0;
public HeapArray(){
this.heapArray = new HeapEntry[this.DEFAULT_HEAPARRAY_LENGTH];
}
public void add(int value,int indexDataSource,int indexData){
heapArray[++size] = new HeapEntry(value, indexDataSource, indexData);
fixUp();
}
public void fixUp(){
int sizeTemp = size;
while(true){
if(sizeTemp==1){
break;
}
HeapEntry heapEntry = heapArray[sizeTemp];
HeapEntry heapEntryTemp = heapArray[sizeTemp/2];
if(heapEntryTemp.value > heapEntry.value){
heapArray[sizeTemp] = heapEntryTemp;
heapArray[sizeTemp/2] = heapEntry;
}
sizeTemp = sizeTemp/2;
}
}
public HeapEntry getMin(){
if(this.size==0) return null;
HeapEntry HeapEntry;
HeapEntry = this.heapArray[1];
this.heapArray[1]=this.heapArray[size];
--size;
fixDown();
return HeapEntry;
}
public void fixDown(){
HeapEntry heapEntryTemp;
for(int i=1;i*2<=size;){
heapEntryTemp = this.heapArray[i];
if(i*2+1<=size && this.heapArray[i*2].value > this.heapArray[i*2+1].value){
if(i*2+1<=size && heapEntryTemp.value > this.heapArray[i*2+1].value){
this.heapArray[i] = this.heapArray[i*2+1];
this.heapArray[i*2+1] = heapEntryTemp;
i = i*2+1;
}
}else{
if(i*2<=size && heapEntryTemp.value > this.heapArray[i*2].value){
this.heapArray[i] = this.heapArray[i*2];
this.heapArray[i*2] = heapEntryTemp;
i = i*2;
}else{
break;
}
}
}
}
public void doPrintln(){
for(int i=1;i<=size;i++){
System.out.println(this.heapArray[i].value);
}
}
public class HeapEntry{
int value;
int indexDataSource;
int indexData;
public HeapEntry(int value,int indexDataSource,int indexData){
this.value = value;
this.indexDataSource = indexDataSource;
this.indexData = indexData;
}
}
}