小问题,各位看看,万能的csdn

jayr110 2012-03-08 10:06:50
#include "stdio.h"
void main()
{
int a[5]={1,3,2,5,4};
int i,j,k,mind;
for(i=0;i<4;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(a[i]>a[j])
k=j;
mind=a[i];
a[i]=a[k];
a[k]=mind;
}
for(i=0;i<5;i++)
printf("%d\t",a[i]);
printf("\n");
}
请问在主循环里的k=i;有什么意义,因为接下来又有一个k=j;但是当我删掉k=i;时程序直接崩溃!求解答。这就是一个冒泡排序啊。不解?
...全文
119 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lc19881029 2012-03-09
  • 打赏
  • 举报
回复
5楼正解,另外这是选择排序,不是冒泡排序,每比较一轮,都把剩下的元素中最小的数放到前面。
k=i;去掉会导致k没有赋初值,就是一个随机值了,又恰好这时第一个数1为最小的,在后面的交换值里面a[k]
会越界。
小白晒太阳 2012-03-09
  • 打赏
  • 举报
回复
我是看了贴的名称进来的,其实 C S D N并不是万能的,关键还会是在于自己多加思考,多调试观察程序运行的步骤。
jayr110 2012-03-09
  • 打赏
  • 举报
回复
谢谢大家,受教了!我当时确实没有想到a[k]会越界,我一定会多多努力,争取早日成为大牛!
  • 打赏
  • 举报
回复
#include "stdio.h"
int main()
{
int a[5]={1,3,2,5,4};
int i,j,mind,k;

for(i=0;i<4;i++)
{
/* k=i;*/
for(j=i+1;j<5;j++)
if(a[i]>a[j])
{k=j;
mind=a[i];
a[i]=a[k];
a[k]=mind;
}
}
for(i=0;i<5;i++)
printf("%d\t",a[i]);
printf("\n");
getchar();
return 0;
}
spcby 2012-03-08
  • 打赏
  • 举报
回复
在MyEclipse中把k=i注释掉和不是注释掉都是4,5,2,3,1,我想问的是if语句加{}和不加具体区别在哪里?请楼主明示
Qyee16 2012-03-08
  • 打赏
  • 举报
回复
#include "stdio.h"
void main()
{
int a[5]={1,3,2,5,4};
int i,j,k,mind; 此时 k的值是随机的,因为它不是全局变量 且未初始化 假设为 k= 22222222
for(i=0;i<4;i++)
{
//k=i; 假设去掉
for(j=i+1;j<5;j++)
if(a[i]>a[j]) 如果a【i】< a【j】总成立 k的值不会改变,仍是假设的值,那下面,你懂的的 k=222222
k=j; //上面说错了 sorry
mind=a[i];
a[i]=a[k];
a[k]=mind;
}
for(i=0;i<5;i++)
printf("%d\t",a[i]);
printf("\n");
}
Qyee16 2012-03-08
  • 打赏
  • 举报
回复

#include "stdio.h"
void main()
{
int a[5]={1,3,2,5,4};
int i,j,k,mind; 此时 k的值是随机的,因为它不是全局变量 且未初始化 假设为 k= 22222222
for(i=0;i<4;i++)
{
//k=i; 假设去掉
for(j=i+1;j<5;j++)
if(a[i]>a[j]) 如果a【i】< a【j】总成立 k的值不会改变,仍是假设的值,那下面,你懂的的 k=222222
k=j; //上面说错了 sorry
mind=a[i];
a[i]=a[k];
a[k]=mind;
}
for(i=0;i<5;i++)
printf("%d\t",a[i]);
printf("\n");
}
Qyee16 2012-03-08
  • 打赏
  • 举报
回复
亲,k没有初值,如果,到了边界,就是k的值没有变化时,就是a【i】>a【j】总成立,没有改变k的值,
你去掉了k=i;

那么,k的值 随机值,你进行交换,肯定会非法访问内存的
erqieshi 2012-03-08
  • 打赏
  • 举报
回复
j循环里是求[i~5]里最小值的下标记为k 然后交换i 和 k
冒泡排序不就这么干的么
jayr110 2012-03-08
  • 打赏
  • 举报
回复
1楼的代码的确是正确的,但是没有懂我的意思,我的if后面没有加大括号,你的有。请再看看!谢谢了
merlinfang 2012-03-08
  • 打赏
  • 举报
回复
K确实没用,写了下,排序正常
void main()
{
int a[5]={1,3,2,5,4};
int i,j,k,mind;
for(i=0;i<4;i++)
{
//k=i;
for(j=i+1;j<5;j++)
{
if(a[i]>a[j]) {
//k=j;
mind=a[i];
a[i]=a[j];
a[j]=mind;
}
}

}
for(i=0;i<5;i++)
printf("%d\t",a[i]);
printf("\n");


}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧