#include <stdio.h>
#define MAXSIZE 8
// 筛选
void sift(int arr[], int start, int end) {
int key = arr[start]; // 保存数组第一个记录的值
int i = start; // 把数组的第一个记录作为二叉树的根
int j = 2 * start + 1; // 根的左孩子
int flag = 1; // 筛选完成的标志
while (j <= end && flag) {
if (j < end && arr[j] < arr[j + 1]) // 选取左、右孩子中数值较大的一个
j++;
if (key > arr[j])
flag = 0;
else {
arr[i] = arr[j];
i = j;
j = 2 * i + 1;
} // 继续筛选
}
arr[i] = key;
}
// 初始创建大根堆
void create_heap(int arr[], int length) {
int i;
for (i = length / 2 - 1; i >= 0; i--) // 从第 length/2-1 个记录开始,自底向上筛选建堆
sift(arr, i, length - 1);
}
void sort(int arr[], int length) {
create_heap(arr, length); // 建初堆
int i;
for (i = length - 1; i >= 0; i--) {
int tmp = arr[0];
arr[0] = arr[i];
arr[i] = tmp;
sift(arr, 0, i - 1);
}
}
int main() {
int arr[MAXSIZE] = { 48, 62, 35, 77, 55, 14, 35, 98 };
sort(arr, MAXSIZE);
int i;
for (i = 0; i < MAXSIZE; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
堆排序算法
最新推荐文章于 2024-10-09 22:28:58 发布