C语言 求一个数组中第二小的数的下标

如题,我们课本上的作业,我自己写的可以运行,但是乱七八糟的,希望有比较好的代码谢谢... 如题,我们课本上的作业,我自己写的可以运行,但是乱七八糟的,希望有比较好的代码谢谢 展开
 我来答
百度网友cb8d0e198
2010-12-30 · TA获得超过1199个赞
知道小有建树答主
回答量:465
采纳率:0%
帮助的人:828万
展开全部
你可以这样做,首先,你定义两个数组,一个数组用来保存原数据(我们将它标记为数组A),另一个数组用来保存排序(从小到大)后的数据(我们将它标记为数组B),我们把数组A排序后的结果放到数组B中,然后取出数组B中的第二个元素(即B[1]),去与数组A中的数据做比较,就可以找出第二小的数据在原数组中的位置了~~~~
我个人认为,给你个解题的思路,让你自己去写代码,胜过于直接给你代码……
如果你想要代码的话,可以跟我讲下,我帮你写~~~但是,我认为这对你没有任何帮助~~
thisisbin
2013-01-18
知道答主
回答量:2
采纳率:0%
帮助的人:3256
展开全部
满意答案是错误的,时间和空间复杂度过高,正确答案如下:
对n个数两两比较,看成是比赛,最后得出冠军和亚军即可,即a[0] vs a[1], a[2] vs a[3],... 最后还有多的就轮空,每次比较的较小值“获胜”进入下一轮;
对“获胜”者继续上述两两比较,知道最后决出“冠军”,这就是n个数的最小值。
我想很容易得知,这样得到最小值共进行了 n-1 次比较操作。
关键是:第二小的数一定是所有与最小值进行过比较的那些数中间的最小值(第二小的一定是曾经被冠军打败过的)。由于最小值一共进行了 log n次比较,因此我们有 log n个candidates. 从这么多数里找最小值需要的比较次数当然是 log n-1。
总共需要的比较次数因此是 n + log n - 2
上面的光排序就需要n*logn了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ahjzysq
推荐于2018-04-14 · TA获得超过221个赞
知道答主
回答量:65
采纳率:0%
帮助的人:44.4万
展开全部
#include <stdio.h>
#define N 5
int main()
{
int i,min=0,smin=-1;//min smin 都是下标
double num[N];
for(i=0;i<N;i++)
scanf("%lf",num+i);
for(i=1;i<N;i++)
{
if(num[i]<num[min])
min=i;
}

if(min==0) //排除特殊情况,smin赋初值的时候不能与min相同
smin=1;
else
smin=0;

for(i=1;i<N;i++)
{
if(smin==min) //如果第二小值与最小值相同不比较
continue;
if(num[i]<num[smin])
smin=i;
}

printf("%lf",num[smin]);
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
doujiangwutang
2010-12-31 · TA获得超过969个赞
知道小有建树答主
回答量:142
采纳率:0%
帮助的人:132万
展开全部
这个您试一下:
#include<stdio.h>
main()
{int m1,m2,a[8],i,k,n;
for(i=0;i<8;i++)
scanf("%d",&a[i]);
m1=a[0];
n=0;
m2=a[1];
k=1;
for(i=1;i<8;i++)
if(a[i]<m1)
{m2=m1;
k=n;
m1=a[i];
n=i;
}
else if((a[i]<m2||m2==m1)&&a[i]!=m1)
{ m2=a[i];
k=i;
}
if(m2==m1)
printf("所有数相同");
else
printf("k=%d",k);
}
或者这个也行:
#include<stdio.h>
main()
{int m1,m2,a[8],j,i=1,k,n;
for(j=0;j<8;j++)
scanf("%d",&a[j]);
m1=a[0];
n=0;
while(i<8)
{if(a[i]!=m1)
{m2=a[i];
k=i;
break;
}
i++;
}
if(i==8)
printf("所有数相同");
else
{for(;i<8;i++)
if(a[i]<m1)
{m2=m1;
k=n;
m1=a[i];
n=i;
}
else if(a[i]<m2&&a[i]!=m1)
{ m2=a[i];
k=i;
}
printf("k=%d",k);
}
}
两种方法都可以,希望能够帮到您。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
w7861690
2010-12-30
知道答主
回答量:19
采纳率:0%
帮助的人:0
展开全部
#include<stdio.h>
void main()
{int a[10];
int i,n,m,k=0;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
n=a[0];
for(i=0;i<10;i++)
if(n>a[i])
n=a[i];
for(i=0;i<10;i++)
if(a[i]!=n)
{ m=a[i];
k=i;break;
}

for(i=0;i<10;i++)
if(m>a[i]&&a[i]>n)
{ m=a[i];
k=i;
}
printf("%d",k);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式