求中位数问题
随机产生两个相同长度(为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); //如果你不用引用,没法返回内部创建的数组,返回后还是没有空间,只是拷贝。。。跟引用变量一样道理