Java堆排序,取得前TopN个数_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2520 | 回复: 0   主题: Java堆排序,取得前TopN个数        下一篇 
    本主题由 hui.chen 于 2015-7-30 15:23:15 移动
kyle
注册用户
等级:新兵
经验:31
发帖:58
精华:0
注册:2011-12-6
状态:离线
发送短消息息给kyle 加好友    发送短消息息给kyle 发消息
发表于: IP:您无权察看 2015-7-28 17:14:39 | [全部帖] [楼主帖] 楼主

import java.util.Random;
publicclass HeapSortUtil {
      /**

     * 用堆排序方法  找出前N个最大的数

     * @originalArray 原始数据数组

     * @topN 需要取得的N个最大数

     * @return  包含topN个最大数的数组

     */
      publicint[] getTopArray(int[] originalArray,int topN){
            int len = originalArray.length ;
            if(len <= topN){
                  return originalArray;
            }
            int[] array = newint [topN];
            initHeap(originalArray);
            int temp;
            for(int i=0;i<array.length;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;
      }
      /**

     * 创建初始无序堆

     */
      privatevoid initHeap(int[] orignalArr){
            for(int i=orignalArr.length-1;i>=0;i--){
                  buildHeap(i,orignalArr.length,orignalArr);
            }
      }
      /**

     * 调整堆

     * @param location 起始位置

     * @param unSortLength 无序堆的长度

     */
      privatevoid buildHeap(int location,int unSortLength,int[] arr){
            int temp;
            int tempLoc;
            //判断该父节点是否有左右孩子
            if((tempLoc = (location+1)*2)<unSortLength){
                  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);//递归
                  }
            }
      }elseif((tempLoc =((location+1)*2-1))<unSortLength){//如果该父节点有左节点
            if(arr[tempLoc]>arr[location]){//如果右节点大于父节点
                  temp = arr[location];
                  arr[location] = arr[tempLoc];
                  arr[tempLoc] = temp;
                  buildHeap(tempLoc,unSortLength,arr);//递归
            }
      }
}
publicstaticvoid main(String[] args) {
      int[] arr =newint[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<topArr.length;i++){
            System.out.println(topArr[i]);
      }
      long end = System.currentTimeMillis()-start;
      System.out.println("Total time:" + end + "ms");
}
}


--转自 北京联动北方科技有限公司



该贴由hui.chen转至本版2015-7-30 15:23:15



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论