HeapSort.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:2k
源码类别:

网格计算

开发平台:

Java

  1. /*
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.util;
  19. /**
  20.  * An implementation of the core algorithm of HeapSort.
  21.  */
  22. public final class HeapSort implements IndexedSorter {
  23.   public HeapSort() { }
  24.   private static void downHeap(final IndexedSortable s, final int b,
  25.       int i, final int N) {
  26.     for (int idx = i << 1; idx < N; idx = i << 1) {
  27.       if (idx + 1 < N && s.compare(b + idx, b + idx + 1) < 0) {
  28.         if (s.compare(b + i, b + idx + 1) < 0) {
  29.           s.swap(b + i, b + idx + 1);
  30.         } else return;
  31.         i = idx + 1;
  32.       } else if (s.compare(b + i, b + idx) < 0) {
  33.         s.swap(b + i, b + idx);
  34.         i = idx;
  35.       } else return;
  36.     }
  37.   }
  38.   /**
  39.    * Sort the given range of items using heap sort.
  40.    * {@inheritDoc}
  41.    */
  42.   public void sort(IndexedSortable s, int p, int r) {
  43.     sort(s, p, r, null);
  44.   }
  45.   /**
  46.    * {@inheritDoc}
  47.    */
  48.   public void sort(final IndexedSortable s, final int p, final int r,
  49.       final Progressable rep) {
  50.     final int N = r - p;
  51.     // build heap w/ reverse comparator, then write in-place from end
  52.     final int t = Integer.highestOneBit(N);
  53.     for (int i = t; i > 1; i >>>= 1) {
  54.       for (int j = i >>> 1; j < i; ++j) {
  55.         downHeap(s, p-1, j, N + 1);
  56.       }
  57.       if (null != rep) {
  58.         rep.progress();
  59.       }
  60.     }
  61.     for (int i = r - 1; i > p; --i) {
  62.       s.swap(p, i);
  63.       downHeap(s, p - 1, 1, i - p + 1);
  64.     }
  65.   }
  66. }