排序算法_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()); } }
相关文章推荐
- 排序算法之堆排序
- 三种排序算法(归并排序、快速排序,堆排序)
- 排序算法之 堆排序 及其时间复杂度和空间复杂度
- 排序算法之---堆排序
- 一步一步解析java排序算法--堆排序(最小堆)
- 【算法之常用排序算法(一)】八大常用内部排序算法(快排、冒泡、希尔、堆排序等)
- 排序算法(3)—优先队列,堆排序
- 排序算法之堆排序
- 排序算法之堆排序
- 排序算法-堆排序
- 排序算法之堆排序
- 用Python实现八大排序算法--堆排序
- 排序算法_堆排序
- 排序算法之堆排序(优先队列)
- 排序算法(四)堆排序
- 排序算法——堆排序
- 【Java常用排序算法】选择排序(简单选择排序、堆排序)
- 排序算法2--简单选择排序、堆排序
- 排序算法总结-插入排序、希尔排序、堆排序、快速排序
- 其他排序算法:快速、归并、堆排序