两个升序数组的中位数
来源:互联网 发布:godaddy域名批量解析 编辑:程序博客网 时间:2024/05/23 20:56
一般情形的解法:
#include <cstdio>double median(int arr[], int size){ if (1 == size % 2) { return(arr[size / 2]); } else { return((arr[size / 2 - 1] + arr[size / 2]) / 2.0); }}double median(int arr_a[], int a_size, int arr_b[], int b_size){ int a_low = 0; int a_hig = a_size - 1; int b_low = 0; int b_hig = b_size - 1; while (a_low <= a_hig && b_low <= b_hig) { int low = 0; if (arr_a[a_low] <= arr_b[b_low]) { low = arr_a[a_low]; ++a_low; } else { low = arr_b[b_low]; ++b_low; } int hig = 0; if (arr_b[b_hig] >= arr_a[a_hig]) { hig = arr_b[b_hig]; --b_hig; } else { hig = arr_a[a_hig]; --a_hig; } if (low == hig) { return(static_cast<double>(low)); } if (a_low > a_hig && b_low > b_hig) { return((low + hig) / 2.0); } if (a_low > a_hig) { return(median(arr_b + b_low, b_hig - b_low + 1)); } if (b_low > b_hig) { return(median(arr_a + a_low, a_hig - a_low + 1)); } } return(0.0);}int main(int argc, char * argv[]){ { int arr_a[] = { 2, 4, 6, 8 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 1, 3, 5, 7 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 2, 4, 6, 8, 9 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 1, 3, 5, 7 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 2, 4, 6, 8 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 1, 3, 5, 7, 9 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 2 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 1, 3, 5, 7 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 2, 4, 6, 8 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 7 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 4, 4, 4, 4 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 1, 3, 5, 7 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 4, 4, 4, 4 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 4 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 2, 4, 6, 8, 13, 15, 19, 21 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 1, 3, 5, 7, 9, 10, 11, 15, 21, 21 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } { int arr_a[] = { 2, 4, 6, 8, 10 }; int a_size = sizeof(arr_a) / sizeof(arr_a[0]); int arr_b[] = { 200, 400, 600, 800, 1000, 1100, 1200 }; int b_size = sizeof(arr_b) / sizeof(arr_b[0]); double d_median = median(arr_a, a_size, arr_b, b_size); printf("median is %g\n", d_median); } return(0);}
对于数组长度相等的情形, 有特殊解法:
当数组长度为奇数时:
如:
A B C D E
a b c d e
如果C > c
则abDE必定不是中位数的组成部分
反之
则ABde必定不是中位数的组成部分
当数组长度为偶数时:
如:
A B C D
a b c d
不能得到上述结论
但我们可以把BC,bc看成一个整体
再利用奇数的情形来解答
#include <cstdio>double median(int arr[], int size){ if (1 == size % 2) { return(arr[size / 2]); } else { return((arr[size / 2 - 1] + arr[size / 2]) / 2.0); }}double median(int * arr_a, int * arr_b, int size){ while (true) { if (1 == size) { return((arr_a[0] + arr_b[0]) / 2.0); } if (2 == size) { int low = 0; if (arr_a[0] > arr_b[0]) { low = arr_a[0]; } else { low = arr_b[0]; } int hig = 0; if (arr_a[1] < arr_b[1]) { hig = arr_a[1]; } else { hig = arr_b[1]; } return((low + hig) / 2.0); } double a_median = median(arr_a, size); double b_median = median(arr_b, size); // a_median == b_median if (a_median - b_median < 0.1 && a_median - b_median > -0.1) { return(a_median); } int jump_over = (size - 1) / 2; if (a_median > b_median) { arr_b += jump_over; } else { arr_a += jump_over; } size -= jump_over; } return(0.0);}int main(int argc, char * argv[]){ { int arr_a[] = { 2, 4, 6, 8 }; int arr_b[] = { 1, 3, 5, 7 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } { int arr_a[] = { 0, 2, 4, 6, 8 }; int arr_b[] = { 1, 3, 5, 7, 9 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } { int arr_a[] = { 1, 2, 3, 4 }; int arr_b[] = { 5, 6, 7, 8 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } { int arr_a[] = { 0, 1, 2, 3, 4 }; int arr_b[] = { 5, 6, 7, 8, 9 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } { int arr_a[] = { 2, 4, 6 }; int arr_b[] = { 1, 2, 3 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } { int arr_a[] = { 4, 6 }; int arr_b[] = { 1, 3 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } { int arr_a[] = { 5 }; int arr_b[] = { 4 }; int size = sizeof(arr_a) / sizeof(arr_a[0]); double d_median = median(arr_a, arr_b, size); printf("median is %g\n", d_median); } return(0);}
- 两个升序数组的中位数
- 求两个长度相同的升序数组的中位数
- 求两个升序序列的中位数
- 求两个已排序(升序)等长的整数数组所有元素的中位数
- 两个数组的中位数
- 算法 - 有两个相同大小数组均已按升序排列好,编程计算这两个数组的中位数(C++)
- 求两个等长升序序列的中位数
- 求两个等长升序序列的中位数
- 求两个等长升序序列的中位数 .
- 求两个等长升序序列的中位数
- 求解两个等长升序序列的中位数
- 两个有序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个有序数组的中位数
- 两个排序数组的中位数
- 两个排序数组的中位数
- 两个有序数组的中位数
- 线程的分离状态
- 【good】用枚举定义有意义的数组下标
- GOP 与I B P 帧
- launch failed.Binary not found in Linux/Ubuntu解决方案
- 跟我一起学makefile
- 两个升序数组的中位数
- The Google Class~谷歌眼睛源码环境编译
- 在GitHub上开源步骤 收藏备用
- mini2440button驱动程序分析
- 编译动态库
- Conversion to Dalvik format failed with error 1
- android DatePicker和TimePicke用法
- eclipse CDT 的launch failed.Binary not found问题的解决方法
- 设计模式 - 简单工厂模式