冒泡排序算法如下:
int temp;
int a[10]={3,45,10,5,68,32,8,9,0,50};
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
if(a[i]>a[j+1])
{temp=a[i];
a[i]=a[j+1];
a[j+1]=temp;}
}
这个冒泡排序写的是有错误的
原因:每次排两三数之后会重新拍
如果把if里面的i换成j就可以了
我的理解,首先有10个数,一般排序是要进行9*9次
如果是9次,第一次循环9次是必须的,无论任何算法,关键在第二个循环
这就要看j的值了
当j等于零的时候,也就是第一个数3要与后面的9个数进行9次比较,如果从小到大那么在循环了9次之后就要把
最小的一个值放在最前面 紧接着进行第二次循环 这时10个数已经变成了9个
自然第二次循环就可以进行8次比较了,所以j的最大值可以减一
第一次
排出a[0]=0 剩下{3,45,10,5,68,32,8,9,50} 此时i等于1 j从0---8
此时我有一个疑问 下次排序还是从a[0] 理解成最小的值已经放到最前面 那后面的数咋排 哎 写出排序的流程吧
3,45,10,5,68,32,8,9,0,50
3,10,45,5,68,32,8,9,0,50
3,10,5,45,68,32,8,9,0,50
3,10,5,45,68,32,8,9,0,50
3,10,5,45,32,68,8,9,0,50
3,10,5,45,32,8,68,9,0,50
3,10,5,45,32,8,9,68,0,50
3,10,5,45,32,8,9,0,68,50
3,10,5,45,32,8,9,0,50,80
写到这里我的疑问消失了,原来在每次排序过后,最大的数值放到最后面了,所以j的值可以减1
从大到小也应该是这个道理吧 把最小的放到了 后面 实践检验整理 试下哈哈
45,3,10,5,68,32,8,9,0,50
45,10,3,5,68,32,8,9,0,50
45,10,5,3,68,32,8,9,0,50
45,10,5,68,3,32,8,9,0,50
45,10,5,68,32,3,8,9,0,50
45,10,5,68,32,8,3,9,0,50
45,10,5,68,32,8,9,3,0,50
45,10,5,68,32,8,9,3,0,50
45,10,5,68,32,8,9,3,50,0
正确
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
{
if(a[j]<a[j+1])
{temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;}
}
世上无难事,只怕无心人。偶也