堆排序
来源:互联网 发布:现货看盘软件下载 编辑:程序博客网 时间:2024/04/30 22:41
- #include <stdio.h>
- #define MAX 10
- typedef char ElementType;
- typedef ElementType ARR[MAX];
- //ARR arr1;//ElementType arr1[MAX];
- int len = sizeof(ARR)/sizeof(ElementType);
- void swap(ElementType arr[],int i,int j)
- {
- ElementType temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- void print(ARR arr)
- {
- int i;
- for(i = 0;i < len;i++)
- {
- printf("%3d",arr[i]);
- }
- printf("\n");
- }
- void heapadjust(ARR arr,int n,int m)//传来的N为双亲的下标,
- {
- int i;
- ElementType temp = arr[n];
- for(i=2*n+1;i <= m;i = 2*i+1)//i=2*N+1为n的左孩子;m是要循环到最后一个孩子;i=i*2+1表示左孩子的左孩子,
- // 即每次步长加到其左孩子
- {
- if(i < m && arr[i] < arr[i+1])//如果左孩子小于右孩子,
- i++;// i=i+1;现在表示左右孩子中大的那个的下标
- if(arr[i] < temp)//如果孩子小于双清跳出循环;
- break;
- arr[n] = arr[i];//不然将大的孩子的值给双亲
- n = i;//持续循环,即将大孩子的下标赋给N作为下次循环的双亲;
- }
- arr[n] = temp;//当俩孩子小于temp时,将temp赋给此时的双亲,
- } // 因为是从下面开始调整的所以当调到上面往下时,下面已经是有序的了
- void heap(ARR arr)
- {
- int i;
- for(i = (len-2)/2;i>=0;i--)//将满二叉树的最后一个满枝的双亲和最后一个孩子传去调整堆
- {
- heapadjust(arr,i,len-1);//重复调用 将每个二叉树进行调整
- }
- for(i = len-1;i >= 0;i--)
- {
- swap(arr,0,i);//交换二叉树顶和尾部的值,然后重新调整时最大的数都排在顶部,
- heapadjust(arr,0,i-1);//完成从小到大的排序
- print(arr);
- }
- }
- int main()
- {
- ARR arr1 = {10,9,8,7,6,5,4,3,2,1};
- printf("heap : \n");
- heap(arr1);
- return 0;
- }
阅读全文
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 闭包的理解和使用
- Linux安装Hadoop2.4.1和伪分布式部署
- 深度学习概述-神经网络与深度学习学习笔记(一)
- innodb_locks_unsafe_for_binlog参数解析
- 第五章 单词查找树
- 堆排序
- Spark 修改整列数据类型+写入数据到HDFS
- Virtuoso使用(下载安装配置)简介
- lucene5--索引域选项
- 吐槽---别走(如何做一个leader)
- CSS浮动
- 51nod 1564 && 1674 区间的价值(V2) 数列分治
- Hadoop 2.7.4 关闭与启动
- 6、python设计模式之工厂模式