#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]); 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]); } }
排序算法_3,堆排序2
最新推荐文章于 2017-10-22 11:19:29 发布