一个简单的排序问题

Anitee 2012-07-06 03:45:11

#include <stdio.h>

#define LEN 5

int a[LEN]={10,5,2,4,7};

void insertion_sort()
{
int i,j,temp;
printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);

for (i=0,j=i+1;i<LEN-1,j<LEN;i++)
{
while (a[i]>a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
j++;
}

}

printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);
}

int main()
{
insertion_sort();

}

这段代码有什么问题?注:在WIN-TC下可以得到正确结果
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anitee 2012-07-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

#include <stdio.h>

#define LEN 5

int a[LEN]={10,5,2,4,7};

void insertion_sort()
{
int i,j,temp;
printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);
for(int n=0;n<LEN;n++){
for (i=0,j=i……
[/Quote]


还要一个for循环是能解决问题,但这个不是只能循环一次,这个是j的越界,j已经取到6了。。。
Anitee 2012-07-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

貌似上面已经有人给楼主解决了。我就建议楼主先取看书吧
[/Quote]


呃。。。大意了一下。这样不错吧


for (j=1;j<LEN;j++)
{
temp=a[j];
i=j-1;
while (i>=0&&a[i]>temp)
{
a[i+1]=a[i];
i--;
}
a[i+1]=temp;

}
Anitee 2012-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

产生错误结果分析:
第一轮:i=0 j=3 数组结果:2 10 5 4 7
第二轮:i=1 j=4 数组结果:2 4 5 10 7
第三轮:i=2 j=4 数组结果:2 4 5 10 7
第四轮:i=3 j=4 此时循环判断a[3]=10>a[4]=7,所以a[3]与a[4]交换,j++
并再次进行循环判断a[3]与a[5]的大小,a[5]是未定义的一个随机值,运气好的话大于a[……
[/Quote]



正解,发现问题所在了,确实是没有判断j是否越界。
clicdl 2012-07-06
  • 打赏
  • 举报
回复
上面说反了,是比前一个小,就往前移
clicdl 2012-07-06
  • 打赏
  • 举报
回复
for(i = 0; i < LEN - 1; i++)
{
for(j = i + 1; j > 0; j--)
{
if(a[j] < a[j-1]) //如果新加入的比前一个大,就往前移
{
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
W170532934 2012-07-06
  • 打赏
  • 举报
回复
貌似上面已经有人给楼主解决了。我就建议楼主先取看书吧
hitcser01 2012-07-06
  • 打赏
  • 举报
回复
我水平很差,帮不了楼主,就给楼主提个建议,发代码时,看到编辑框上方有个“#”标识,可以让代码格式更好~
yamilo1 2012-07-06
  • 打赏
  • 举报
回复
产生错误结果分析:
第一轮:i=0 j=3 数组结果:2 10 5 4 7
第二轮:i=1 j=4 数组结果:2 4 5 10 7
第三轮:i=2 j=4 数组结果:2 4 5 10 7
第四轮:i=3 j=4 此时循环判断a[3]=10>a[4]=7,所以a[3]与a[4]交换,j++
并再次进行循环判断a[3]与a[5]的大小,a[5]是未定义的一个随机值,运气好的话大于a[3],得到正确结果
运气不好小于a[3],后面就不说了

补充说明:这个程序排序不具备普遍适用性,楼主把数组改为5,10,2,4,7试一下

修改建议:如2楼所说,while改成for(详细就不说了)
lenovosl410k 2012-07-06
  • 打赏
  • 举报
回复
#include <stdio.h>

#define LEN 5

int a[LEN]={10,5,2,4,7};

void insertion_sort()
{
int i,j,temp;
printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);

for (i=0;i<LEN-1,j<LEN;i++)
{

j=i+1;
printf("i=%d,j=%d\n",i,j);
while (a[i]>a[j]&&j<5)
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
j++;
printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);
}

}


}

int main()
{
insertion_sort();

}

说实话这个是对的,我找了半天错啊
lenovosl410k 2012-07-06
  • 打赏
  • 举报
回复
#include <stdio.h>

#define LEN 5

int a[LEN]={10,5,2,4,7};

void insertion_sort()
{
int i,j,temp;
printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);
for(int n=0;n<LEN;n++){
for (i=0,j=i+1;i<LEN-1,j<LEN;i++)
{
while (a[i]>a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
j++;
}
}

}

printf("%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4]);
}

int main()
{
insertion_sort();
}

还要一个for循环,你一个for循环只能执行一次

69,371

社区成员

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

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