python堆排序求topn_Java堆排序,取得前TopN个数
import java.util.Random;
/**
* Created with IntelliJ IDEA.
* User: pengfei.hpf
* Date: 14-4-29
* Time: 上午11:45
* To change this template use File | Settings | File Templates.
*/
public class HeapSortUtil {
/**
* 用堆排序方法 找出前N個最大的數
* @originalArray 原始數據數組
* @topN 需要取得的N個最大數
* @return 包含topN個最大數的數組
*/
public int[] getTopArray(int[] originalArray,int topN){
int len = originalArray.length ;
if(len <= topN){
return originalArray;
}
int[] array = new int [topN];
initHeap(originalArray);
int temp;
for(int i=0;i
array[i]= originalArray[0];
temp=originalArray[originalArray.length-i-1];
originalArray[originalArray.length-i-1]=originalArray[0];
originalArray[0]=temp;
buildHeap(0,originalArray.length-i-1,originalArray);
}
return array;
}
/**
* 創建初始無序堆
*/
private void initHeap(int[] orignalArr){
for(int i=orignalArr.length-1;i>=0;i--){
buildHeap(i,orignalArr.length,orignalArr);
}
}
/**
* 調整堆
* @param location 起始位置
* @param unSortLength 無序堆的長度
*/
private void buildHeap(int location,int unSortLength,int[] arr){
int temp;
int tempLoc;
//判斷該父節點是否有左右孩子
if((tempLoc = (location+1)*2)
if(arr[tempLoc]>arr[tempLoc-1]){//如果右節點大于左節點
if(arr[tempLoc]>arr[location]){//如果右節點大于父節點 就雙方交換值
temp = arr[location];
arr[location] = arr[tempLoc];
arr[tempLoc] = temp;
buildHeap(tempLoc,unSortLength,arr);//遞歸
}
}else{//如果左節點大于右節點
if(arr[tempLoc-1]>arr[location]){//如果左節點大于父節點
temp = arr[location];
arr[location] = arr[tempLoc-1];
arr[tempLoc-1] = temp;
buildHeap(tempLoc-1,unSortLength,arr);//遞歸
}
}
}else if((tempLoc =((location+1)*2-1))
if(arr[tempLoc]>arr[location]){//如果右節點大于父節點
temp = arr[location];
arr[location] = arr[tempLoc];
arr[tempLoc] = temp;
buildHeap(tempLoc,unSortLength,arr);//遞歸
}
}
}
public static void main(String[] args) {
int[] arr =new int[100000];
Random ran = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = ran.nextInt(100000);
}
HeapSortUtil h = new HeapSortUtil();
long start = System.currentTimeMillis();
int topArr[] = h.getTopArray(arr, 20);
//打印出排序后的數組
for(int i=0;i
System.out.println(topArr[i]);
}
long end = System.currentTimeMillis()-start;
System.out.println("Total time:" + end + "ms");
}
}
總結
以上是生活随笔為你收集整理的python堆排序求topn_Java堆排序,取得前TopN个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 特斯拉全球大降价引维权!马斯克回应:涨价
- 下一篇: 联名中国第一科幻IP!荣耀80 Pro《