一个11×11的数组,利用指针求中位数,以及中位数所在的行列序号(用c语言)有大佬可以提供一下代码吗,写不出来
11乘以11的数组,共121个数,中位数是排序后的第61个数,因为要输出行和列,所以需要用一级指针复制数组。
代码如下:
#include <stdio.h>
#include <stdlib.h>
//冒泡排序
void bubble_sort(int* a,int n)
{
int i,j,t;
for (i=0;i<n-1;i++)
{
for (j=0;j<n-1-i;j++)
{
if(a[j] > a[j+1]) //从小到大,升序
{
t = a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main()
{
int a[11][11],i,j,t=0;
int *p = (int*)malloc(sizeof(int)*121); //把a中的数据保存到p中,用p进行排序,找中位数。
printf("请输入11*11的数组:\n");
for(i=0;i<11;i++)
{
for (j=0;j<11;j++)
{
scanf("%d",&a[i][j]);
*(p+t) = a[i][j];
t++;
}
}
//对p排序
bubble_sort(p,121);
//第61个数即为中位数
for(i=0;i<11;i++)
{
for (j=0;j<11;j++)
{
if(a[i][j] == *(p+60))
break;
}
}
//序号从0开始,也就是第1行的序号为0,如果序号需要从1开始,显示就改成i+1和j+1
printf("中位数所在的行序号为%d,列序号为%d",i,j);
free(p);
p=0;
return 0;
}
你这个二维数组中的数据首先要没有重复。有重复的话,如果中位数是某个重复数字,不能说哪一个是中位数啊。
如果没有重复,那就将11*11个整数排序,由于总数是奇数,所以中位数就是最中间的那个元素。然后将该元素值在二维数组中进行搜索,找到该值就知道其行列序号了。
#include <stdio.h>
int fun(int*p)
{
for(int i=0;i<10;i++)
for(int j=0;j<10-i;j++)
{
if(p[i] > p[i+1])
{
double d = p[j];
p[j] = p[j+1];
p[j+1] = d;
}
}
return p[5];
}
int main()
{
int a[11][11];
int b[11];
int i,j,t,c;
for(i=0;i<11;i++)
for(j=0;j<11;j++)
scanf("%d",&a[i][j]);
for(i=0;i<11;i++)
b[i] = fun(a[i]);
c = fun(b);
for(i=0;i<11;i++)
for(j=0;j<11;j++)
{
if(a[i][j] == c)
{
printf("中位数行列号为[%d,%d]",i,j);
return 0;
}
}
return 0;
}
#include <stdio.h>
void swap(int *p,int *q) {
int t;
t=*p;
*p=*q;
*q=t;
}
void sort(int a[],int n) {
int i,j,temp;
for(i=0;i<n-1;i++) {
for(j=0;j<n-i-1;j++) {
if(a[j]>a[j+1])
swap(&a[j],&a[j+1]);
}
}
}
int main() {
int a[] = {6,3,8,5,1};
int n = 5;
int sum,i;
sort(a,n);
n = (n+1) / 2 - 1; // -1 as array indexing in C starts from 0
printf("Median = %d ", a[n]);
return 0;
}
参考一下