学校数据结构上完内排序,自己写了一个堆排序的demo,尽可能简化,使代码可读性强。
#includeusing 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 a[maxIdx]) maxIdx = left; if (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] << " "; }



