C语言 求一个数组中第二小的数的下标
答案:5 悬赏:0 手机版
解决时间 2021-03-13 10:29
- 提问者网友:鼻尖触碰
- 2021-03-13 00:56
C语言 求一个数组中第二小的数的下标
最佳答案
- 五星知识达人网友:低血压的长颈鹿
- 2021-03-13 02:34
你可以这样做,首先,你定义两个数组,一个数组用来保存原数据(我们将它标记为数组A),另一个数组用来保存排序(从小到大)后的数据(我们将它标记为数组B),我们把数组A排序后的结果放到数组B中,然后取出数组B中的第二个元素(即B[1]),去与数组A中的数据做比较,就可以找出第二小的数据在原数组中的位置了~~~~
我个人认为,给你个解题的思路,让你自己去写代码,胜过于直接给你代码……
如果你想要代码的话,可以跟我讲下,我帮你写~~~但是,我认为这对你没有任何帮助~~
我个人认为,给你个解题的思路,让你自己去写代码,胜过于直接给你代码……
如果你想要代码的话,可以跟我讲下,我帮你写~~~但是,我认为这对你没有任何帮助~~
全部回答
- 1楼网友:夜风逐马
- 2021-03-13 06:56
#include
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);
}
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);
}
- 2楼网友:山君与见山
- 2021-03-13 05:58
这个您试一下:
#include
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] {m2=m1;
k=n;
m1=a[i];
n=i;
}
else if((a[i] { m2=a[i];
k=i;
}
if(m2==m1)
printf("所有数相同");
else
printf("k=%d",k);
}
或者这个也行:
#include
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] {m2=m1;
k=n;
m1=a[i];
n=i;
}
else if(a[i] { m2=a[i];
k=i;
}
printf("k=%d",k);
}
}
两种方法都可以,希望能够帮到您。
#include
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]
k=n;
m1=a[i];
n=i;
}
else if((a[i]
k=i;
}
if(m2==m1)
printf("所有数相同");
else
printf("k=%d",k);
}
或者这个也行:
#include
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]
k=n;
m1=a[i];
n=i;
}
else if(a[i]
k=i;
}
printf("k=%d",k);
}
}
两种方法都可以,希望能够帮到您。
- 3楼网友:独钓一江月
- 2021-03-13 05:28
满意答案是错误的,时间和空间复杂度过高,正确答案如下:
对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了
对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了
- 4楼网友:过活
- 2021-03-13 04:09
#include
#define N 5
int main()
{
int i,min=0,smin=-1;//min smin 都是下标
double num[N];
for(i=0;i scanf("%lf",num+i);
for(i=1;i {
if(num[i] min=i;
}
if(min==0) //排除特殊情况,smin赋初值的时候不能与min相同
smin=1;
else
smin=0;
for(i=1;i {
if(smin==min) //如果第二小值与最小值相同不比较
continue;
if(num[i] smin=i;
}
printf("%lf",num[smin]);
return 0;
}
#define N 5
int main()
{
int i,min=0,smin=-1;//min smin 都是下标
double num[N];
for(i=0;i
for(i=1;i
if(num[i]
}
if(min==0) //排除特殊情况,smin赋初值的时候不能与min相同
smin=1;
else
smin=0;
for(i=1;i
if(smin==min) //如果第二小值与最小值相同不比较
continue;
if(num[i]
}
printf("%lf",num[smin]);
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯