急教!冒泡排序 !C的问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 03:21:07
定义一数组,然后有小到大排列输出!
请问哪出错! 我想了很久,自己觉得逻辑没发生错误,如果有,望能详细指出来
我输出的结果是5,3,10,11,12,6 晕!那个6是怎样发生错误的?

#include<stdio.h>

main()
{
int i,d,n=6;/*i为循环,d为中间量,n为数组数*/
int a[]={3,2,5,10,11,12};
for(;n>0;n--)
{
for(i=0;i<n;i++)
{
if(a[i+1]>a[i])
{
d=a[i];
a[i]=a[i+1];
a[i+1]=d;
}
}
}

for(i=0;i<6;i++)
printf(" %d\n",a[i]);
}
还是不能啊...

从小到大的话,if(a[i+1]>a[i]) ,这个肯定是写反了,
应该是if(a[i+1]<a[i])
外循环条件应该改成for(;n>1;n--)
否则n=0会多一次循环
你看改过运行怎样

n = 5;
if(a[i] > a[n])
交换a[i]和a[n]

#include<stdio.h>

main()
{
int i,j,d,n=6,flag;/*i为循环,d为中间量,n为数组数,n应该为5,数组从下标0起*/
int a[]={3,2,5,10,11,12};
for(i=1;i<n;i++)//共执行n-1次冒泡
{
flag=0;//flag表示有没有交换,没有交换则表示已经有序,退出不再冒泡
for(j=n-1;j>=i;j--)
{
if(a[j]<a[j-1])
{
d=a[j];
a[j]=a[j-1];
a[j-1]=d;
flag=1;
}
if(flag==0)
break;
}
}

for(i=0;i<n;i++)
printf(" %d\n",a[i]);
}