学校数据结构上完内排序,自己写了一个堆排序的demo,尽可能简化,使代码可读性强。
#include<iostream>
using namespace std;
void adjust(int a[], int len, int index) {
int left = 2 * index + 1;
int right = 2 * index + 2;
int maxIdx = index;
//maxIdx是3个数中最大数的下标
if (left<len && a[left]>a[maxIdx]) maxIdx = left;
if (right<len && a[right]>a[maxIdx]) maxIdx = right;
if (maxIdx != index) {//如果maxIdx的值有更新
swap(a[maxIdx], a[index]);
adjust(a, len, maxIdx);//递归调整其他不满足堆性质的部分
}
}
void heapSort(int a[], int size) {
for (int i = size / 2 - 1; i >= 0; i--) {//对每一个非叶节点进行堆调整(从最后一个非叶节点开始)
adjust(a, size, i);
}
for (int i = size - 1; i >= 1; i--) {
swap(a[0], a[i]);//选出的堆顶(当前最大数)与末尾元素交换
adjust(a, i, 0);//将未完成排序的部分继续进行堆排序,这里是堆顶发生了变化,所以从堆顶开始调整
}
}
int main() {
int n; cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++)
cin >> a[i];
heapSort(a, n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
}