算法思路:采用冒泡排序方法对n个数按升序排序,共需n-1趟排序。第i趟排序过程:相邻数组元素a[0]和a[1]、a[1]和a[2]、…、a[n-1-i]和a[n-i]依次进行比较,如果a[j]>a[j+1],则交换a[j]和a[j+1]。
代码实现:
#include<stdio.h>
int main()
{
int i,j;
int a[10],temp;
printf("input 10 numbers:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<10;i++)
{
for(j=0;j<10-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("%3d",a[i]);
}
printf("\n");
return 0;
}
运行结果:
这种排序不论a[j]是否大于a[j+1]都做了比较,导致效率下降。现在我们改进下算法,使得有序的数比较时不需要交换数据。引进变量flag来帮助判断
改进代码:
#include<stdio.h>
int main()
{
int i,j,flag;
int a[10],temp;
printf("input 10 numbers:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<10;i++)
{
flag=0;//假设第i趟没有交换数据,给flag赋值为0
for(j=0;j<10-i;j++)
{
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
if(flag==0)break;//没有数据交换时终止循环
}
for(i=0;i<10;i++)
{
printf("%3d",a[i]);
}
printf("\n");
return 0;
}