堆排序
public void sort(int[] a) {
buildMaxHeap(a);
int size = a.length;
for (int i = a.length - 1; i >= 1; i--) {
int temp = a[0];
a[0] = a[i];
a[i] = temp;
size --;
maxHeapify(a, i);
}
}
数组存储二叉树下的父结点
public int parent(int n) {
return n >> 1;
}
数组存储二叉树下的左孩子
public int left(int n) {
return 2 * n + 1;
}
数组存储二叉树下的右孩子
public int right(int n) {
return 2 * n + 2;
}
递归实现大顶堆化
public void maxHeapify(int[] a, int n) {
int l = left(n);
int r = right(n);
int largest;
if (l <= a.length && a[l] > a[n]){
largest = l;
} else {
largest = n;
}
if (r <= a.length && a[r] > a[largest]){
largest = r;
}
if (largest != n) {
int temp = a[n];
a[n] = a[largest];
a[largest] = temp;
maxHeapify(a, largest);
}
}
构建大顶堆
public void buildMaxHeap(int[] a) {
for (int i = a.length >> 1; i >= 0; i--) {
maxHeapify(a, i);
}
}
递归实现小顶堆化
public void minHeapify(int[] a, int n) {
int l = left(n)
int r = right(n)
int mini
if (l <= a.length && a[l] < a[n]){
mini = l
} else {
mini = n
}
if (r <= a.length && a[r] < a[mini]){
mini = r
}
if (mini != n) {
int temp = a[n]
a[n] = a[mini]
a[mini] = temp
minHeapify(a, mini)
}
}
构建小顶堆
public void buildMinHeap(int[] a) {
for (int i = a.length >> 1; i >= 0; i--) {
minHeapify(a, i);
}
}