posts - 195, comments - 34, trackbacks - 0, articles - 1

          導航

          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(14)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          收藏夾

          技術基礎

          技術相關

          研究方向

          算法類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          使用用最小堆來找最大的K個數(shù)

          Posted on 2009-12-06 11:29 小強摩羯座 閱讀(813) 評論(0)  編輯  收藏 所屬分類: 算法編程
          /**
               * 最小堆化,使用遞歸
               
          */

              
          static void minHeapity(int[] a, int i, int size)
              
          {
                  
          int left = (i << 1+ 1// i * 2 + 1,當下標從0正式開始時
                  int right = (i << 1+ 2;
                  
          int t;
                  
          if (left < size && a[left] < a[i])
                      t 
          = left;
                  
          else
                      t 
          = i;
                  
          if (right < size && a[right] < a[t])
                      t 
          = right;
                  
          if (t != i)
                  
          {
                      a[t] 
          = a[i] + a[t] - (a[i] = a[t]);
                      minHeapity(a, t, size);
                  }

              }

              
          /**
               * 最小堆化,不使用遞歸,并且合并表示
               * 
          @param size
               
          */

              
          static void minHeapityNOCur(int[] a, int i, int size)
              
          {
                  
          int p = i;
              
                  
          while(p < size)
                  
          {
                      
          int q = p * 2 + 1;// q指向最小的孩子結點
                      if( q >= size) return;
                      
          if( q < (size-1&& a[q+1< a[q])
                          q 
          = q + 1;// q 指向右
                      if( a[q] < a[p])
                      
          {
                          a[q] 
          = a[p] + a[q] - ( a[p] = a[q]);
                          p 
          = q;
                      }

                      
          else break;//已經不用調整了
                  }

              }

              
          static void maxK( int k)
              
          {
                  
          int[] maxKs = new int[k];
                  
          try
                  
          {
                      Scanner scan 
          = new Scanner(new File("IntNums10K.txt"));
                      
          for (int i = 0; i < k; i++)
                      
          {
                          
          if (scan.hasNextInt())
                          
          {
                              maxKs[i] 
          = scan.nextInt();
                          }

                      }

                      System.out.println(
          "最初K個值"+ Arrays.toString(maxKs));
                      
          // builder the heap
                      int size = maxKs.length;
                      
          for (int i = (size - 1/ 2; i >= 0; i--)
                          minHeapity(maxKs, i, size);
                      
                      System.out.println( 
          "建堆后"+Arrays.toString(maxKs));
                      
          while(scan.hasNextInt())
                      
          {
                          
          int tmpN = scan.nextInt();
                          
          if( tmpN <= maxKs[0])
                              
          continue;
                          maxKs[
          0= tmpN;
                          minHeapity(maxKs, 
          0, size);
                      }

                      System.out.println(
          "得到最大的K個"+ Arrays.toString(maxKs));
                  }
           catch (FileNotFoundException e)
                  
          {
                      e.printStackTrace();
                  }

              }


          主站蜘蛛池模板: 西平县| 东阿县| 大埔县| 吉安县| 平潭县| 鄂伦春自治旗| 射洪县| 湘阴县| 澎湖县| 库伦旗| 临颍县| 辽阳县| 大庆市| 青冈县| 新建县| 赤城县| 深水埗区| 承德市| 南京市| 勃利县| 怀安县| 葵青区| 麟游县| 南岸区| 迭部县| 保山市| 仙桃市| 全南县| 沙雅县| 汤阴县| 清原| 荣成市| 西昌市| 襄汾县| 瑞金市| 成都市| 荃湾区| 浑源县| 离岛区| 灯塔市| 偏关县|