考研数据结构 408王道
排序-堆排序-大根堆
#include <iostream>
using namespace std;
//本题建立大根堆,进行大根堆排序。
int heap[9] ;
//65 78 32 45 17 87 9 53
//将k为根的子树调整为大根堆。
void adjustheap(int h[], int k, int len) {
h[0] = h[k];
for (int i = 2 * k; i <= len; i *= 2) {//下沉一层
if (i < len && h[i] < h[i + 1])
i++;
if (h[0] >= h[i])
break;
else {
h[k] = h[i];
k = i;
}
}
h[k] = h[0];
}
void BuildHeap(int h[], int len) {
for (int i = len / 2; i > 0; i--) {
adjustheap(h, i, len);
}
}
void sort(int h[], int len) {
BuildHeap(h, len);
for (int i = len; i > 1; i--) {//将堆顶元素与待排区域最后元素进行对调。
swap(h[1], h[i]);
adjustheap(h, 1, i - 1 );
}
}
int main() {
freopen("HeapSort_in.txt", "r", stdin);
for (int i = 1; i < 9; i++)
cin >> heap[i];
for (int i = 1; i < 9; i++)
cout << heap[i] << " ";
cout << endl;
sort(heap, 8);
for (int i = 1; i < 9; i++)
cout << heap[i] << " ";
return 0;
}