您的位置:首页 > 其它

排序算法_3,堆排序

2017-09-20 21:39 113 查看
#include <stdio.h>

int h[15] = {0,99,5,36,7,22,17,46,12,2,19,25,28,1,92}; //堆数组,h[0]不在计算范围内,不是堆里的元素,请忽略
int n = 14;      //堆元素个数

//交换两个数
void swap(int *x, int *y){
int t;
t = *x;
*x = *y;
*y = t;
}

//向下调整下标为i的节点
void siftdown(int i){
int t;
//当还有子节点时
while (i*2 <= n){
//判断i与其左子节点大小
if (h[i] > h[i*2])
t = i*2;
else
t = i;
//如果有右子节点,要再比较一下
if (i*2+1 <= n)
if (h[t] > h[i*2+1])
t = i*2+1;
//如果t不是当前节点i,交换两节点位置,并开始向下调整下一个子节点
if (t != i){
swap(&h[i], &h[t]);
i = t;
}
//否则该节点已满足最小堆要求,跳出循环
else
            break;

}
}

//每次生成最小堆后最小的数肯定就在根节点,返回根节点的数
int deleteMin(){
int t = h[1];
h[1] = h
;
n--;
siftdown(1);
return t;
}

//生成最小堆
void creatHeap(){
int i;
//从最后一个非叶节点开始向下调整,直至调整到根
for (i = n/2; i >= 1; --i) {
siftdown(i);
}
}

void main() {
//排序前输出一次
printf("start:\n");
for (int i = 1; i <= n ; ++i) {
printf("%3d", h[i]);
}
printf("\ncreate the minHeap:\n");
creatHeap();
for (int i = 1; i <= n ; ++i) {
printf("%3d", h[i]);
}
//依次输出根节点
printf("\nsort after:\n");
for (int i = 1; i <= 14; ++i) {
printf("%3d", deleteMin());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: