- package heap;
-
- import java.math.BigInteger;
-
- /**
- * 最大堆最小堆性质:
- * 完全二叉树
- * left=2i;
- * right=2i+1;
- * 最大堆:除根节点外,子节点<父节点
- * 最小堆:除根节点外,子节点>父节点
- * 堆排序算法复杂度:o(n*lgn)
- *
- * @author B.Chen
- *
- */
- public class MaxHeap {
-
- public int heapSize;
-
- public int parent(int i) {
- return i / 2;
- }
-
- public int left(int i) {
- return 2 * i;
- }
-
- public int right(int i) {
- return 2 * i + 1;
- }
-
- public void maxHeapify(int[] a, int i) {
- int l = left(i);
- int r = right(i);
- int largest = i;
- if (l < heapSize) {
- if (a[l] > a[i]) {
- largest = l;
- }
- }
- if (r < heapSize) {
- if (a[r] > a[largest]) {
- largest = r;
- }
- }
- if (largest != i) {
- int temp = a[i];
- a[i] = a[largest];
- a[largest] = temp;
- maxHeapify(a, largest);
- }
- }
-
- public void builtMaxHeap(int[] a) {
- heapSize = a.length;
- for (int i = (a.length - 1) / 2; i >= 0; i--) {
- maxHeapify(a, i);
- }
- }
-
- public void heapSort(int[] a) {
- builtMaxHeap(a);
- for (int i = a.length - 1; i > 0; i--) {
- int temp = a[0];
- a[0] = a[i];
- a[i] = temp;
- heapSize = heapSize - 1;
- maxHeapify(a, 0);
- }
- }
-
- public static void main(String[] args) {
- MaxHeap mh = new MaxHeap();
- int[] a = new int[] { 7, 6, 4, 2, 8, 3, 1, 5, 9, 0 };
- mh.heapSort(a);
- for (int i = 0; i < a.length; i++) {
- System.out.print(a[i] + " ");
- }
- }
-
- }
-
- 其中2×i可以用二进制表示成i<<1
2×i+1可以表示成(i<<1)+1