#include <iostream>
using namespace std;
void swap(int arr[], int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[k] = tmp;
}
void heapify(int tree[], int n, int i) {
if(i > n){
return;
}
int c1 = 2*i + 1;
int c2 = 2*i + 2;
int max = i;
if (c1 < n && tree[c1] > tree [max]){
max = c1; //子节点大于父节点,把子节点的下标给最大值下标
}
if (c2 < n && tree[c2] > tree[max]){
max = c2;
}
if (max != i) { //父子节点交换
swap(tree, max, i);
heapify(tree, n, max);
}
}
void build_heap(int tree[], int n){
int last_node = n - 1;
int parent = (last_node - 1) / 2;
int i;
for(i = parent; i >= 0; i--){
heapify(tree, n, i);
}
}
void heap_sort(int tree[], int n){
build_heap(tree, n);
int i;
for (i = n - 1; i >= 0; i--){
swap(tree, i, 0);
heapify(tree, i, 0);
}
}
int main() {
int tree[] = {4, 10, 3, 5, 1, 2};
int n = 6;
heap_sort(tree, n);
int i;
for(i = 0; i < n; i++){
cout << tree[i] << " ";
}
return 0;
}
方法:先从堆的中间开始排序,保证父节点都是大于子节点的,建立堆,然后每次用最大的顶和最后一个数字置换,利用i--把最大的值排到数组的最后,利用heapify继续排序,直到所有数组排完。