中位数求值(分治法)

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

//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 }

 

 

posted @ 2019-03-09 15:30  shadowgully  阅读(1591)  评论(0编辑  收藏  举报