您的位置:首页 > 其它

排序算法_3,堆排序2

2017-09-21 01:22 232 查看
#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){
//节点i还有子节点时
while (i*2<=n){
int t = 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;

}
}

//创建最大堆
void createMaxHeap() {
//从最后一个非叶节点开始
int i;
for (i = n / 2; i >= 1; --i)
siftdown(i);
}

//堆排序
void heapSort(){
while (n>1){
//此时h[1]肯定是最大的(因为已经生成了最大堆),与堆末尾交换
swap(&h[1], &h
);
n--;
siftdown(1);
}
}

void main() {
//排序前输出一次
printf("start:\n");
for (int i = 1; i <= n ; ++i) {
printf("%3d", h[i]);
}
//生成最大堆
createMaxHeap();
//进行堆排序
heapSort();
//输出排序后的结果
printf("\n");
for (int i = 1; i <= 14 ; ++i) {
printf("%3d", h[i]);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: