大佬们,我自己整的“变态选择排序”为什么运行达不到效果?

zyx6680599 2019-01-09 11:04:35
#include<stdio.h>
#include<stdlib.h>
int main()

{
int a[10];
int b,i;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=10;i>1;i--)
{
if(a[i]<a[i-1])
{
b=a[i];
a[i]=a[i-1];
a[i-1]=b;
}
}
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
system("pause");
return 0;
}

...全文
366 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyx6680599 2019-01-15
  • 打赏
  • 举报
回复
引用 7 楼 niiiloc 的回复:
区别大了,一重循环无法交换已经被交换过的数,所以一重循环排序后的结果并不一定是对的
例如321
一重循环只能变成213 321->231->213
二重循环才能变成123 213->123
引用 6 楼 zyx6680599 的回复:
大佬,虽然一个是一重循环,一个是二重循环,但是这两个循环都是将每一个元素和下个元素比较并交换的啊,为什么效果上就不一样呢

谢谢!
636f6c696e 2019-01-14
  • 打赏
  • 举报
回复
区别大了,一重循环无法交换已经被交换过的数,所以一重循环排序后的结果并不一定是对的 例如321 一重循环只能变成213 321->231->213 二重循环才能变成123 213->123
引用 6 楼 zyx6680599 的回复:
大佬,虽然一个是一重循环,一个是二重循环,但是这两个循环都是将每一个元素和下个元素比较并交换的啊,为什么效果上就不一样呢
zyx6680599 2019-01-13
  • 打赏
  • 举报
回复
引用 4 楼 自信男孩 的回复:
[quote=引用 3 楼 zyx6680599 的回复:]
[quote=引用 1 楼 自信男孩 的回复:]
选择排序应该是双层循环呢,看你的代码是一层循环,那么只能对数组做一次排序,找到最大值或者最小值并放到对应的位置。

大佬麻烦给我详细解释一下,(可能我太笨听不明白),我看选择排序不就是将数组的每一个元素与下一个元素做对比么?
就类似这样:for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j])
b=a[i];a[i]=a[j];a[j]=b;
与我的这段
for(i=10;i>1;i--)
{
if(a[i]<a[i-1])
{
b=a[i];
a[i]=a[i-1];
a[i-1]=b;
}
}
有什么本质上不一样呢?请大佬给予详细解答,万分感谢[/quote]

区别还是很明显的,一个是一重循环,一个是二重循环。另外,
for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j])
b=a[i];a[i]=a[j];a[j]=b;

这个代码有问题,缺少一个大括号。

for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j]) {
b=a[i];a[i]=a[j];a[j]=b;
}
[/quote]
大佬,虽然一个是一重循环,一个是二重循环,但是这两个循环都是将每一个元素和下个元素比较并交换的啊,为什么效果上就不一样呢
自信男孩 2019-01-10
  • 打赏
  • 举报
回复
引用 3 楼 zyx6680599 的回复:
[quote=引用 1 楼 自信男孩 的回复:]
选择排序应该是双层循环呢,看你的代码是一层循环,那么只能对数组做一次排序,找到最大值或者最小值并放到对应的位置。

大佬麻烦给我详细解释一下,(可能我太笨听不明白),我看选择排序不就是将数组的每一个元素与下一个元素做对比么?
就类似这样:for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j])
b=a[i];a[i]=a[j];a[j]=b;
与我的这段
for(i=10;i>1;i--)
{
if(a[i]<a[i-1])
{
b=a[i];
a[i]=a[i-1];
a[i-1]=b;
}
}
有什么本质上不一样呢?请大佬给予详细解答,万分感谢[/quote]

区别还是很明显的,一个是一重循环,一个是二重循环。另外,
for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j])
b=a[i];a[i]=a[j];a[j]=b;

这个代码有问题,缺少一个大括号。

for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j]) {
b=a[i];a[i]=a[j];a[j]=b;
}
自信男孩 2019-01-09
  • 打赏
  • 举报
回复
选择排序应该是双层循环呢,看你的代码是一层循环,那么只能对数组做一次排序,找到最大值或者最小值并放到对应的位置。
zyx6680599 2019-01-09
  • 打赏
  • 举报
回复
引用 1 楼 自信男孩 的回复:
选择排序应该是双层循环呢,看你的代码是一层循环,那么只能对数组做一次排序,找到最大值或者最小值并放到对应的位置。

大佬麻烦给我详细解释一下,(可能我太笨听不明白),我看选择排序不就是将数组的每一个元素与下一个元素做对比么?
就类似这样:for(i=0;i<8;i++)
for(j=1;j<9;j++)
if(a[i]<a[j])
b=a[i];a[i]=a[j];a[j]=b;
与我的这段
for(i=10;i>1;i--)
{
if(a[i]<a[i-1])
{
b=a[i];
a[i]=a[i-1];
a[i-1]=b;
}
}
有什么本质上不一样呢?请大佬给予详细解答,万分感谢

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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