1、首先建立大根堆
2、然后交换堆首和堆尾,将堆大小减一,将堆尾元素退出堆结构,排好一个数
3、循环即可知道堆大小为1
//堆排序
#include <iostream>
using namespace std;
void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void heap_insert(int arr[],int index) {
while (arr[index] > arr[(index - 1) / 2]) {
swap(arr, index, (index - 1) / 2);
index = (index - 1) / 2;
}
}
void heapify(int arr[], int index,int heap_size) {
int left = index * 2 + 1;
while (left<heap_size)
{
int largest = (left + 1 < heap_size) && (arr[left + 1] > arr[left]) ? left + 1 : left;
largest = arr[largest] > arr[index]?largest:index;
if (largest == index) {
break;
}
swap(arr, largest, index);
//更新index
index = largest;
//更新left
left = index * 2 + 1;
}
}
int main() {
int n;
while (cin >> n) {
int* p = new int[n];
for (int i = 0; i < n; i++) {
cin >> p[i];
}
for (int i = 0; i < n; i++) {
heap_insert(p, i);//搞成大根堆
}
int heap_size = n;
swap(p, 0, --heap_size);//换
while (heap_size > 0) {
heapify(p, 0, heap_size);//有一个index改变了,再搞成大根堆
swap(p, 0, --heap_size);//换
}
for (int i = 0; i < n; i++) {
cout << p[i] << " ";
}
cout << endl;
}
}
测试: