求教C语言冒泡排序问题.帮忙看看哪里错了!谢谢

#include <stdio.h>
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
void fun( STREC a[] )
{STREC k;int j,i;
for(i=0;i<N;i++)
for(j=1;j<N;j++)
if(a[j].s>a[i].s)
{k=a[j];a[j]=a[i];a[i]=k;}

}
main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}};
int i;FILE *out ;
fun( s );
printf("The data after sorted :\n");
for(i=0;i<N; i++)
{ if( (i)%4==0 )printf("\n");
printf("%s %4d ",s[i].num,s[i].s);
}

#include <stdio.h>
#define N 16
typedef struct
{
char num[10];
int s;
} STREC;
void fun( STREC a[] )
{
STREC k;int j,i;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++) --------------------------------------------j 改成i+1
if(a[j].s<a[i].s)
{
k=a[j];
a[j]=a[i];
a[i]=k;
}
}
main()
{
STREC s[N]={
{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
{"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}
};
int i;
FILE *out ;
fun( s );
printf("The data after sorted :\n");
for(i=0;i<N; i++)
{
if( (i)%4==0 )printf("\n");
printf("%s %4d ",s[i].num,s[i].s);
}
}追问

我这里不换成I+1的话,第二轮循环第一次是A[1]和A[1]的比较这个没问题呀。第三轮第一次的时候是A[2]和A[1]。这不会导致错误吧?

追答

冒泡排序的顺序是 这样的:比如
有10个数序号为 :
12345678910;
我们从1开始比较,1和2 比,然后找出大的或者更小的和3比,一次类推。
当1比较完之后2开始比,这个时候的2,是不需要和他前面的那位数比较的,因为他前面的数肯定已经比过了,直接和3比较就对了,冒泡法的最终比较次数是55次,不是100次

追问

我的这个算法是重复了,但没有错对吧?但是为什么系统没有办法完成比较?

追答

有问题。冒泡法实际不只是比较,他还要赋值,会把小的和大的顺序对调,你的j没有规律,会导致重复对调。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-29
for(j=1;j<N;j++)
这里改成
for(j=i;j<N;j++)
会不会正确了?
第2个回答  2013-03-29
for(j=1;j<N;j++)
这里改成
for(j=0;j<N-i;j++)
第3个回答  2013-03-29
for(j=0;j<N-i;j++),还有你这个for循环下所要执行的内容用括号括好范围。
相似回答