一个简单的排序问题
[code=C/C++][/code]
#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下可以得到正确结果
[解决办法]
#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循环只能执行一次
[解决办法]
#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();
}
说实话这个是对的,我找了半天错啊
[解决办法]
产生错误结果分析:
第一轮: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(详细就不说了)
[解决办法]
我水平很差,帮不了楼主,就给楼主提个建议,发代码时,看到编辑框上方有个“#”标识,可以让代码格式更好~
[解决办法]
貌似上面已经有人给楼主解决了。我就建议楼主先取看书吧
[解决办法]
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;
}
}
}