堆与堆排序

1.自下而上构造堆

先随机生成一棵用数组表示的完全二叉树(只有最右边的树叶可缺),然后自下而上的构造堆。

堆相对于完全二叉树的区别:
父母优势:所有的内点都大于它的子女。

//二叉树的堆化
#include
using namespace std;
//定义堆数组
int heap[100];
void MaxNode(int n) {
  int max = heap[n] > heap[n-1] ? n : n-1;
  if (heap[max] > heap[n/2]) swap(heap[max], heap[n/2]);
}
//树的堆化
void TreeToHeap(int n) {
  int k = n;
  //单独考虑右支缺位情况
  if (n & 1) {//左支未缺位
    MaxNode(n);
    k = n - 2;
  } else {//左支缺位
    if (heap[n] > heap[n/2]) swap(heap[n], heap[n/2]);
    k = n - 1;
  }
  //自底向上比较
  for (; k > 3; k -= 2) MaxNode(k);
  //较小头节点去向
  k = 1;
  while (heap[k] != 0) {
    int max = heap[2*k] > heap[2*k+1] ? 2*k : 2*k+1;
    if (heap[max] > heap[k]) swap(heap[max], heap[k]);
    k = max;
  }
}
//打印堆
void PrintHeap(int N) {
  for (int i = 1; i <= N; ++i) cout << heap[i] << " ";
  cout << endl;
}
int main() {
  int N;
  cin >> N;
  for (int i = 1; i <= N; ++i) cin >> heap[i];
  TreeToHeap(N);
  PrintHeap(N);
}

未完待续

你可能感兴趣的:(数据结构,堆排序,heap)