自我学习 - C++堆排序
堆排序:
#include <iostream>
using namespace std;
// 建大根堆
void Heap_build(int a[], int root, int len) {
int lchild = root*2 + 1;
if (lchild < len) {
int flag = lchild;
int rchild = lchild + 1;
if (rchild < len) {
if (a[rchild] > a[lchild]) {
flag = rchild;
}
}
if (a[root] < a[flag]) {
// 交换根节点和最大的子节点
swap(a[root], a[flag]);
// 从最大的子节点开始继续递归建堆
Heap_build(a, flag, len);
}
}
}
// 堆排序
void Heap_sort(int a[], int len) {
// 建大根堆
for (int i = len / 2; i >= 0; --i) {
Heap_build(a, i, len);
}
// 把每次大根堆的最大值放到相应位置(从小到大)
for (int j = len - 1; j > 0 ; --j) {
swap(a[0], a[j]);
// 交换后破坏了大根堆,需要再次建大根堆
Heap_build(a, 0, j);
}
}
int main(){
int a[10] = {12,45,748,12,56,3,89,4,48,2};
Heap_sort(a, 10);
for (int i = 0; i < 10; ++i) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}

浙公网安备 33010602011771号