中位数求值(分治法)

输入两段相同长度的正序序列,求出合并后的中位数,例如:

//input.txt
2
5 15
3 21
//output.txt
5
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define MAX_SIZE 1000
 4 int get_mid_num(int a[],int b[],int n); 
 5 // int fgetc(FILE *fp)       从文件中读一个字符
 6 // int fputc(int c,FILE *fp)  向文件写入一个字符 
 7 // char * fgets(char *s,int size,FILE *fp); 从文件中读取若干个字符
 8 // int fputs(const char*str,FILE *fp);      把str(可视为字符数组名)所指向的字符串,输出到fp所指的文件中 
 9 // int fscanf(FILE *fp,str "***%d***",a,b,c) 
10 //fscanf 与 fputs 的区别:fscanf遇到换行和空格都要结束,而fputs仅仅遇到换行时结束 
11  
12  
13 //  二进制方式
14 //unsigned fread(void *buf,unsigned size,unsigned count,FILE * fp)  数据块读取(输入)函数fread
15 //unsigned fwrite(const void *buf,unsignedsize,unsigned count ,FILE *fp)   将buf所指向内存中的count个数据块写入fp指向的文件中。每个数据块大小为size 
16 int main()
17 {
18     FILE *fp;
19     fp=NULL;
20     fp=fopen("input.txt","r");
21     if(fp==NULL)
22     {
23         printf("Failed to open file!\n");
24         exit(0);
25     }
26     int a[MAX_SIZE];
27     int b[MAX_SIZE];
28     int n;
29 //    printf("input n: ");
30 //    scanf("%d",&n);
31     fscanf(fp,"%d",&n);
32 //    printf("input a: ");
33     for(int i=0;i<n;i++)
34     {
35 //        scanf("%d",a+i);
36         fscanf(fp,"%d",a+i);
37     }
38 //    printf("input b: ");
39     for(int i=0;i<n;i++)
40     {
41 //        scanf("%d",b+i);
42         fscanf(fp,"%d",b+i);
43     }
44     fclose(fp);
45     fp=fopen("output.txt","w");
46     if(fp==NULL)
47     {
48         printf("Failed to open file!\n");
49         exit(0);
50     }
51 //    printf("%d",get_mid_num(a,b,n));
52     fprintf(fp,"%d",get_mid_num(a,b,n));
53     fclose(fp);
54     return 0;
55 } 
56 
57 get_mid_num(int a[],int b[],int n)
58 {
59 //    printf("\n%d",n);
60     if(a[(n-1)/2]==b[(n-1)/2])
61     {
62 //        printf("!!!");
63         return a[(n-1)/2];
64     }
65 
66     if(n==1)
67     {
68 //        printf("n==1!");
69         if(*a>*b)
70             return *b;
71         else
72             return *a;
73     }
74     else
75     {
76         if(a[(n-1)/2]>b[(n-1)/2])
77         {
78 //            printf("mid of a is %d\t",a[(n-1)/2]);
79 //            printf("mid of b is %d\t",b[(n-1)/2]);
80             get_mid_num(&a[0],&b[n-(n+1)/2],(n+1)/2);
81         }
82         else
83         {
84 //            printf("mid of a is %d\t",a[(n-1)/2]);
85 //            printf("mid of b is %d\t",b[(n-1)/2]);
86             get_mid_num(&a[n-(n+1)/2],&b[0],(n+1)/2);
87         }
88     }
89 }

 

 

转载于:https://www.cnblogs.com/sgawscd/p/10501060.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是中位数问题的分治法伪代码: ``` def find_median(nums): n = len(nums) if n % 2 == 1: # 如果数组元素个数是奇数 return quick_select(nums, n // 2) # 直接找到第 n//2 小的元素即为中位数 else: # 如果数组元素个数是偶数 return (quick_select(nums, n // 2 - 1) + quick_select(nums, n // 2)) / 2 # 找到第 n//2 - 1 小和第 n//2 小的元素,取平均值作为中位数 def quick_select(nums, k): if len(nums) == 1: # 如果只有一个元素,则返回该元素 return nums[0] pivot = random.choice(nums) # 随机选择一个枢轴元素 left = [x for x in nums if x < pivot] # 将小于枢轴的元素放到左边数组 right = [x for x in nums if x > pivot] # 将大于枢轴的元素放到右边数组 mid = [x for x in nums if x == pivot] # 将等于枢轴的元素放到中间数组 if k < len(left): # 如果第 k 小的元素在左边数组中,递归处理左边数组 return quick_select(left, k) elif k < len(left) + len(mid): # 如果第 k 小的元素在中间数组中,直接返回中间数组的第一个元素 return mid[0] else: # 如果第 k 小的元素在右边数组中,递归处理右边数组 return quick_select(right, k - len(left) - len(mid)) ``` 其中,`quick_select` 函数用于找到第 k 小的元素,`find_median` 函数用于找到数组的中位数。在 `find_median` 函数中,如果数组元素个数是奇数,则直接找到第 n//2 小的元素即为中位数;如果数组元素个数是偶数,则找到第 n//2 - 1 小和第 n//2 小的元素,取平均值作为中位数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值