维持中位数的方法?
2014-01-08 16:34
176 查看
双堆:令数组L的中位数为m,用一个最大堆存储数组L中不大于m的元素,用一个最小堆存储数组L中不小于m的元素,其中这两个堆均不包含中位数m。每次往数组L插入新元素x时,若x<m,则将其插入最大堆(因为最大堆的最大值不大于m),否则插入最小堆(最小堆的最小值不小于m)。若插入新元素后导致m不再是中位数(即两个堆的元素数目相差2个或2个以上),则将当前的中位数m插入到元素数量较少的那个堆中,然后令元素数量较多的那个堆的堆顶元素为新的中位数,并将该堆顶元素从堆中删除。
#include <stdio.h> void adjust_min_heap(int *arr, int pos, int len); void adjust_max_heap(int *arr, int pos, int len); void create_min_heap(int *arr, int len); void create_max_heap(int *arr, int len); void min_heap_sort(int *arr, int len); void max_heap_sort(int *arr, int len); void create_max_heap(int *arr, int len) { int i; int scope = len / 2; while (scope >= 0) { adjust_heap(arr, scope--, len); } } void adjust_max_heap(int *arr, int pos, int len) { int right, left; int k = pos; left = 2 * pos; right = left + 1; if (left >= len) { return; } if ( arr[k] < arr[left]) { k = left; } if (right < len && arr[k] < arr[right]) { k = right; } if (pos != k) { int tmp = arr[k]; arr[k] = arr[pos]; arr[pos] = tmp; adjust_max_heap(arr, k, len); } } void max_heap_sort(int *arr, int len) { int tmp; create_max_heap(arr, len); while (len > 0) { tmp = arr[0]; arr[0] = arr[len - 1]; arr[len - 1] = tmp; adjust_max_heap(arr, 0, --len); } } void create_min_heap(int *arr, int len) { int i; int scope = len / 2; while (scope >= 0) { adjust_min_heap(arr, scope--, len); } } void adjust_min_heap(int *arr, int pos, int len) { int right, left; int k = pos; left = 2 * pos; right = left + 1; if (left >= len) { return; } if ( arr[k] > arr[left]) { k = left; } if (right < len && arr[k] > arr[right]) { k = right; } if (pos != k) { int tmp = arr[k]; arr[k] = arr[pos]; arr[pos] = tmp; adjust_min_heap(arr, k, len); } } void min_heap_sort(int *arr, int len) { int tmp; create_min_heap(arr, len); while (len > 0) { tmp = arr[0]; arr[0] = arr[len - 1]; arr[len - 1] = tmp; adjust_min_heap(arr, 0, --len); } } int median(int *max_heap, int *max_heap_len, int *min_heap, int *min_heap_len, int median, int input) { int diff; int new_median; if (input < median) { max_heap[*max_heap_len] = input; *max_heap_len += 1; create_max_heap(max_heap, *max_heap_len); } else { min_heap[*min_heap_len] = input; *min_heap_len += 1; create_min_heap(max_heap, *max_heap_len); } diff = *min_heap_len - *max_heap_len; if (diff < 2 && diff > -2) { return median; } else if (diff <= -2) { min_heap[*min_heap_len] = median; *min_heap_len += 1; create_min_heap(min_heap, *min_heap_len); new_median = max_heap[0]; *max_heap_len -= 1; max_heap[0] = max_heap[*max_heap_len]; adjust_max_heap(max_heap, 0, *max_heap_len); } else { max_heap[*max_heap_len] = median; *max_heap_len += 1; create_max_heap(max_heap, *max_heap_len); new_median = min_heap[0]; *min_heap_len -= 1; min_heap[0] = min_heap[*min_heap_len]; adjust_min_heap(min_heap, 0, *min_heap_len); } return new_median; }
相关文章推荐
- 用.NET发起web请求时维持Session的方法zt
- scala 对大数据量排序求中位数 lookup方法
- 取中位数的方法
- 81条维持和扩大人脉的方法之
- C++之基于排序方法求一组数的中位数
- 《算法导论》提供的快速排序时而输入数据有序时的化解方法(5分法取中位数)
- 两个有序数组的中位数求解方法
- UVa11300分金币-中位数方法
- 用AlarmManager来维持心跳,在小米手机失效,在其他机子上可以,大婶们,求解决方法
- sqlserver 中位数计算方法
- Python查找两个有序列表中位数的方法【基于归并算法】
- 维持Session的另类方法
- 基于R语言的数据分析和挖掘方法总结——中位数检验
- ASP.NET基础教程-维持状态的方法及其区别
- java.net模拟用户登录网页并维持session的方法
- Unity官方使用的FPS 的 计数方法,以及得出用于统计对比的中位数,平均数,方差
- SQL Server 下取中位数(中位值)的方法
- 程序员面试金典——解题总结: 9.18高难度题 18.9随机生成一些数字并传入某个方法。编写一个程序,每当收到新数字时,找出并记录中位数。
- SQL Server 下取中位数(中位值)的方法
- 找中位数(用堆维持小的一半数,建立大根堆)