堆的定义:数据在二叉完全树中从左到右从上到下依次存储
大顶堆,父节点的数据大于所有子节点的数据
小顶堆,父节点的数据小于所有子节点的数据
堆排序: 是将完全二叉树的数据从叶子节点向根节点排序成顶堆
,将根节点与二叉树尾节点交换,屏蔽尾节点(假设存
储大小减一),然后重复以上过程到排序完成的过程 。
#include <stdio.h>
#include<stdlib.h>
void ad_heap(int* data,int i,int size) {
int j, tmp, pst = 0;
tmp = data[i];
j = i * 2;
while (j<= size && pst == 0) {
if ((j + 1) <= size) {
if (data[j] < data[j+1]) {
j++;
}
}
if (tmp > data[j]) {
pst = 1;
}
else {
data[j / 2] = data[j];
j = 2 * j;
}
}
data[j / 2] = tmp;
}
void heap(int *data,int size) {
//建立整体最大堆
int i,tmp;
for (i = size/2;i>0;i--) {
ad_heap(data,i,size);
}
printf("\n整体大顶堆 : ");
for (i = 1; i <= size; i++) {
printf("[%2d]", data[i]);
}
//堆积排序
for (i = size - 1; i > 0; i--) {
tmp = data[i + 1];
data[i + 1] = data[1];
data[1] = tmp;
ad_heap(data,1,i);
}
printf("\n堆积排序结果 : ");
for (i = 1; i <= size; i++) {
printf("[%2d]", data[i]);
}
}
int main(){
int size,i;
printf("请输入所需排序的数据量 : ");
scanf_s("%d",&size,sizeof(int));
getchar();
int* data = (int*)calloc(size,sizeof(int));
printf("请逐一输入要进行排序的数据:\n");
for (i = 1; i <= size;i++) {
printf("第%d个数据 : ",i);
scanf_s("%d",&data[i]);
}
printf("\n原数组 : ");
for (i = 1; i <= size; i++) {
printf("[%2d]", data[i]);
}
heap(data,size);
return 0;
}