两个升序数组的中位数
2013-05-08 16:00
148 查看
一般情形的解法:
对于数组长度相等的情形, 有特殊解法:
当数组长度为奇数时:
如:
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 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++)
- 求两个长度相同的升序数组的中位数
- 减治法求解两个升序数组的中位数
- 分治法求解两个升序数组的中位数
- leetcode 4 : Median of Two Sorted Arrays 找出两个数组的中位数
- 给定两个有序数组求他们的中位数
- 有两个升序的的数组A1和A2,内存在A1末尾有足够的多余空间容纳A2,设计一个函数,把A2中的所有数字插入到A1中并且所有的数字都是升序的。
- Q4 Median of Two Sorted Arrays 两个有序数组的中位数
- 求两个有序数组的中位数
- 两个有序数组的中位数
- Lintcode 两个排序数组的中位数
- 求两个有序数组的中位数
- 寻找两个有序数组中的第K个数或者中位数
- 两个有序数组的中位数求解方法
- 有两个升序排列的数组A1和A2,给A1开辟的剩余内存有足够空间容纳A1,请实现一个函数,把A2中所有数字插入到A1中,并且是按照升序排列的
- 【两个有序数组求中位数】
- [c语言]将两个整形升序数组合并为一个升序数组
- 微软面试14题 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 求两个有序数组的中位数(4. Median of Two Sorted Arrays)