双堆求中位数及C实现
来源:互联网 发布:java生成嵌套json数据 编辑:程序博客网 时间:2024/05/20 05:10
堆
堆的动态创建与删除可参考http://blog.csdn.net/pngynghay/article/details/22101359,此处不再赘述。
双堆求中位数
算法描述:
1、创建两个堆(一个小根堆、一个大根堆),堆大小至少为给定数据个数的一半,(size+1)/2,即向上取整;
2、假定变量mid用来保存中位数,取定第一个元素,赋值给mid,即作为初始的中位数;
3、依次遍历后面的每一个数据,如果比mid小,则插入大根堆;否则插入小根堆;
4、如果大根堆和小根堆上的数据个数相差为2,则将mid插入到元素个数较少的堆中,然后从元素个数较多的堆中删除根节点,并将跟节点赋值给mid;
5、重复步骤3和4,直到所有的数据遍历结束;
此时,mid保存了一个数,再加上两个堆中保存的数,就构成了给定数据的集合。
如果两个堆中元素个数相等,则mid即为最终的中位数;否则,元素较多的堆的根节点元素与mid的和求平均值,即为最终的中位数。
算法实现
算法实现采用了整数,所以,最终的结果取了整数,可以将返回值转换为浮点型,更精确。
uint32_t getmedian(uint32_t *array, uint32_t size){int i = 0, minelem = 0, maxelem = 0;uint32_t mid = array[0];uint32_t heapsize = (size+1)/2;heap_t *minheap = heap_malloc(heapsize);heap_t *maxheap = heap_malloc(heapsize);for(i = 1; i < size; i++){if(array[i] < mid){maxheap_insert(maxheap, array[i]);maxelem++;}else{minheap_insert(minheap, array[i]);minelem++;}if(minelem - maxelem > 1){maxheap_insert(maxheap, mid);mid = minheap->element[0];minheap_delete(minheap);maxelem++;minelem--;}if(maxelem - minelem > 1){minheap_insert(minheap, mid);mid = maxheap->element[0];maxheap_delete(maxheap);minelem++;maxelem--;}}printf("\nmaxelem = %d, minelem = %d, pre_mid = %d\n", maxelem, minelem,mid);if(minelem > maxelem){printf("\nmid = ( mid+minheap->element[0])/2 = (%d + %d)/2 = %d\n",mid, minheap->element[0],(mid+minheap->element[0])/2);mid = (mid+minheap->element[0])/2;}if(maxelem < maxelem){printf("\nmid = ( mid+maxheap->element[0])/2 = (%d + %d)/2 = %d\n", mid, minheap->element[0],(mid+maxheap->element[0])/2);mid = (mid+maxheap->element[0])/2;}heap_free(minheap);heap_free(maxheap);return mid;}
测试程序
#define NUM 10int main(){ uint32_t array[NUM] = {2,20,13,18,15,8,3,5,4,25}; getmedian(array, NUM); printf("\n"); return 0;}
测试结果
0 0
- 双堆求中位数及C实现
- 中位数及带权中位数
- Erlang和C实现O(n)复杂度求中位数
- 双堆求中位数
- 双堆求中位数
- 双堆求中位数
- 双堆求中位数
- 中位数及带权中位数问题
- 中位数问题(/C++)
- 中位数(C语言)
- 【Mysql】实现中位数计算
- Java实现-中位数
- codeforces 166C Median 中位数
- poj 2388 c++:寻找中位数
- PAT 2-13 两个有序序列的中位数(C语言实现)
- 快速排序----QuickSort 中位数实现
- 数据流中的中位数java实现
- 中位数
- scrollview+viewpaver组合时viewpaver高度设置和滑动冲突问题
- 2014蓝桥杯本科C/C++组预赛第9题<斐波那契>解题报告
- 【jQuery 事件】- isDefaultPrevented() 方法
- 嵌入式 PPPD拨号脚本详解摘录
- 管闲事的小明
- 双堆求中位数及C实现
- 多线程中的lua同步问题
- C/C++实现split分割字符串
- 引用
- 28027 SCI boot 例程【TI FAE分享】
- struts2拦截器
- The Google File System中文版附英文资源链接(上)
- 网络游戏同步法则
- 简单工厂模式