首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求中位数有关问题

2012-04-04 
求中位数问题随机产生两个相同长度(为n)的数组X,Y先用函数对两个数组排好序,找出两个数组(2n长)的中位数。

求中位数问题
随机产生两个相同长度(为n)的数组X,Y先用函数对两个数组排好序,找出两个数组(2n长)的中位数。时间复杂度为
log(n)。如果对X,Y数组事先指定,编译没问题,加上动态数组后就有问题了。
问题为:0x00b615b2 处有未经处理的异常: 0xC0000005: 读取位置 0x00000010 时发生访问冲突。
代码如下:

C/C++ code
#include<stdio.h>#include<stdlib.h>#include<time.h>void main(){    float mid_valuePass(int X[],int Y[],int n);    void random(int *p,int n);    printf("please enter a number!\n");    int n;    scanf("%d",&n);    int     *X=NULL; /*创建指针,指向下面创建的动态数组*/    int  *Y=NULL;    printf("array X: ");    random(X,n);    printf("array Y: ");    random(Y,n);    float median=mid_valuePass(X,Y,n);/*求中位数*/    printf("The mid-vlanue is %f\n",median);    system("pause");}/*求left和right的一半*/int mid_value(int R[],int left,int right){    int middle=(left+right)/2;    return R[middle];  //调试时这里出问题:0x00b615b2 处有未经处理的异常: 0xC0000005: 读取位置 0x00000010 时发生访问冲突}/*求中位数的函数,不用动态数组时运行成功*/float mid_valuePass(int X[],int Y[],int n)  {    int mid_value(int R[],int left,int right);    int i1,i2;i1=i2=0;    int j1,j2;j1=j2=n-1;    int median1,median2;    float median;    median1=mid_value(X,i1,j1);    median2=mid_value(Y,i2,j2);      while(median1!=median2&&i1!=j1&&i2!=j2)       {         if(median1<median2)          {              i1=(i1+j1)/2;              j2=(i2+j2)/2;              median1=mid_value(X,i1,j1);              median2=mid_value(Y,i2,j2);          }        else        {            i2=(i2+j2)/2;            j1=(i1+j1)/2;            median1=mid_value(X,i1,j1);            median2=mid_value(Y,i2,j2);        }      }                if(X[i1]<Y[i2]) median1 = Y[i2];        else return median1 = X[i1];        if(i1==j1)        {            if(Y[j2]>X[j1+1]) median2 = X[j1+1];            else median2 = Y[j2];        }        else if(i2==j2)        {            if(Y[j2+1]>X[j1]) median2 = X[j1];            else median2 = Y[j2+1];        }    return median = (float) (median1 + median2) / 2;            }/*自动生成一个动态数组,接受n个1-99的随机数*/void random(int *p,int n){    void BubbleSort(int R[],int n);    srand(time(NULL));    p=(int *)malloc(n*sizeof(int ));    for(int i=0;i<n;i++)    {        p[i] = rand()%100;    }    printf("\n");    BubbleSort(p,n);    for(int i=0;i<n;i++)    {        printf("%d ",p[i]);    }    printf("\n");}/*冒泡排序法,但是时间复杂度高,如果要减少时间复杂度可以选其他排序法*/void BubbleSort(int R[],int n) {    int i,j,temp;    for(i=0;i<n-1;i++)    {        for(j=n-1;j>i;j--)        {            if(R[j]<R[j-1])            {                temp=R[j];                R[j]=R[j-1];                R[j-1]=temp;            }        }    }}


[解决办法]
void random(int *&p,int n); //如果你不用引用,没法返回内部创建的数组,返回后还是没有空间,只是拷贝。。。跟引用变量一样道理

热点排行