首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个简单的排序有关问题

2012-08-08 
一个简单的排序问题[codeC/C++][/code]#include stdio.h#define LEN 5int a[LEN]{10,5,2,4,7}void in

一个简单的排序问题
[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;
}
}
}

热点排行
Bad Request.