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

          使用用最小堆來找最大的K個數

          Posted on 2009-12-06 11:29 小強摩羯座 閱讀(812) 評論(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();
                  }

              }


          主站蜘蛛池模板: 平潭县| 岚皋县| 武冈市| 大悟县| 阿克苏市| 武平县| 北海市| 浏阳市| 苍溪县| 资源县| 上虞市| 鄂尔多斯市| 丹寨县| 定陶县| 五寨县| 金川县| 宁都县| 舞钢市| 呼玛县| 中西区| 嘉善县| 黔西县| 陵水| 惠东县| 和平区| 沈丘县| 双柏县| 高邑县| 安徽省| 辉县市| 京山县| 定陶县| 剑阁县| 东安县| 万源市| 明星| 民乐县| 长葛市| 睢宁县| 禄劝| 馆陶县|