排序算法_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]); } }
相关文章推荐
- 排序算法——堆排序
- 排序算法——堆排序
- 排序算法之堆排序(二)
- [028]八大排序算法详解——堆排序
- 排序算法--堆排序
- 排序算法整理(5)堆排序
- Java排序算法总结(六):堆排序
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- 排序算法思想——归并排序、堆排序、shell排序
- 排序算法五——堆排序
- 【排序算法】堆排序的分析
- 排序算法-堆排序
- 排序算法系列-堆排序-快速排序-基数排序-简单选择排序-归并排序
- 排序算法(五) —— 堆排序
- 数据结构之排序算法二:堆排序,快速排序,归并排序
- 常见排序算法:堆排序
- 排序算法(2) 堆排序 C++实现
- 排序算法一(直接选择,堆排序,冒泡排序和快速排序)
- 排序算法之堆排序
- 排序算法——堆排序