// (堆排序-大堆) 使用数组来表示 二叉树型结构
static void down_adjust(int array[], int size, int father) {
int r_chirld = 0;
int l_chirld = 0;
bool flag = false;
for (int cur = father; cur <= size / 2 - 1; ) {
r_chirld = (cur + 1) * 2;
l_chirld = (cur + 1) * 2 - 1;
flag = false;
if (r_chirld >= size) {// 无右孩子
if (array[l_chirld] > array[cur]) {
std::swap(array[l_chirld], array[cur]);
cur = l_chirld;
flag = true;
}
}
else {
if (array[l_chirld] >= array[r_chirld] && array[l_chirld] > array[cur]) {
std::swap(array[l_chirld], array[cur]);
cur = l_chirld;
flag = true;
}
else if (array[l_chirld] < array[r_chirld] && array[r_chirld] > array[cur]) {
std::swap(array[r_chirld], array[cur]);
cur = r_chirld;
flag = true;
}
}
if (!flag) break;
}
}
static void create_heap(int array[], int size) {
// 从最后一个父节点开始调整
int father = size / 2 - 1;
for (int i = father; i >= 0; --i) {
// 调整每一个节点
down_adjust(array, size, i);
}
}
void heap_sort(int array[], int size) {
if (!array || size <= 0) {
return;
}
// 构建堆
create_heap(array, size);
// 逐个删除
for (int i = size; i >= 1; --i) {
std::swap(array[i - 1], array[0]);
down_adjust(array, i - 1, 0);
}
}
排序算法-堆排序
最新推荐文章于 2024-11-04 19:24:37 发布