冒泡法:
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。(360百科)
分析:
在比较过程中,有两层循环。外层循环执行的次数为:元素的个数减1(每执行一次外层循环冒出一个“最大的”,确定了一个元素,行)。内层循环执行的次数:元素个数减1再减去执行次数(两两进行比较,比较完所有的元素后,就确定了一个元素,列)。
代码:
#include<stdio.h>
void main()
{
int i,j,temp=0;
int a[10]={4,6,7,2,1,0,9,5,3,8};
for(i=0;i<10;i++)
printf("%2d",a[i]);
printf("\n");
for(i=0;i<9;i++)
for(j=0;j<10-1-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(i=0;i<10;i++)
printf("%2d",a[i]);
}
结果如下:
优化:
当没有元素交换的时候,就退出循环。通过设置标志位实现。
#include<stdio.h>
void main()
{
int i,j,temp=1;
int n=0,m=0;//分别记录外层循环和内层循环的次数
int flag=0;//标志位
int a[10]={1,0,3,2,4,5,6,7,8,9};
for(i=0;i<10;i++)
printf("%2d",a[i]);
printf("\n");
for(i=0;i<9;i++)
{
flag=0;
for(j=0;j<10-1-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
m++;
}
n++;
if(!flag) break;
}
for(i=0;i<10;i++)
printf("%2d",a[i]);
printf("\n");
printf("外层循环次数%d,内层循环次数%d",n,m);
}