重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
用的sort,设定一个结构体struct Com{ int num; int position; }; 在自定义比较函数bool myCom(Com A,Com B ){return A.num B.num; } 然后设置一个com类型的数组,使用系统的sort函数,对这个数组排序,排完以后是降序,系统的这个sort应该比较快,应该差不多nlogn,然后在对这个数组遍历,找到第几大的,大概总的时间复杂度为O(nlogn + n)吧~
为西山等地区用户提供了全套网页设计制作服务,及西山网站建设行业解决方案。主营业务为网站设计制作、成都网站建设、西山网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
方法有很多:
1、可以直接找到数组对应行的元素,进行交换数据,改变原数组内容。
2、可以定义指针数组指向每行的首地址,交换指针地址,按顺序打印每个指针为首的行数据,得到数据交换效果,原数组内容不变。
我这里用第2种方法给你写了一个,你参考吧。
#include stdio.h
int main ()
{
int nArry[4][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6},{4,5,6,7}};
int *p[4],i,j,*psave,index[2];//p[]分别指向每行首地址
printf("打印原数组:");
i=16; p[0]=nArry[0][0];
while(i--0)
{
if((i+1)%4==0)
printf("\n");
printf("%d ",*(p[0]));
p[0]++;
}
while(1)
{
printf("\n\n输入2个你要交换的行号:");
scanf("%d%d",index[0],index[1]);
for(i=0;i4;i++)
{
p[i]=nArry[i][0];
}
psave=p[index[0]-1];
p[index[0]-1]=p[index[1]-1];
p[index[1]-1]=psave;
printf("第%d行和第%d行调换后的数组为:\n",index[0],index[1]);
for(i=0;i4;i++) //按顺序打印 首地址指针开头的行数字
{
for(j=0;j4;j++)
{
printf("%d ",*(p[i]+j));
}
printf("\n");
}
}
return 0;
}
nArray [10]=0;这一行是错误的。已经数组使用越界了。应该删除的。
下面就是在上述代码中将此行语句删除以后的运行结果:
#includestdio.h
void conarry(int x[],int n);
main()
{
int a[10] ,i;
for (i=0;i10;i++)
scanf("%d",a[i]);//输入的是地址
conarry (a,9);//输入的是9,如果输入10,肯定是错误的,因为没有a[10]元素
for (i=0;i10;i++)
printf("%d\t",a[i]);
}
void conarry (int x[],int n)
{
int i,t;
for(i=0;i=n/2;i++)//输入的是偶数个,要加=号
{
t=x[i];
x[i]=x[n-i];
x[n-i]=t;
}
} 不懂可以问我!