10个数由小到大排序:冒泡法
主要注意外层循环和内层循环的终止值,可以考虑成3个数比较大小,共需要2趟,第一趟比较2次,第二趟比较1次;那么10个数比较大小,共需要9趟,第1趟比较9次,第2趟比较8次……..想清楚变量i和j的结束值就不会出错了。
#include<stdio.h>
void BubbleSort(int a[],int n)
{
int i,j,temp;
for(i=0;i<n-1;i++) //比较的趟数
for(j=0;j<n-1-i;j++) //每趟比较的次数
{
//由小到大排序
if(a[j]>a[j+1]) //a[j]<a[j+1]由大到小排序
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
void main()
{
int a[10],i;
printf("please input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("The array is:\n");
for(i=0;i<10;i++)
printf("%-4d",a[i]);
BubbleSort(a,10);
printf("\nAfter sort the array is:\n");
for(i=0;i<10;i++)
printf("%-4d",a[i]);
printf("\n");
}
/***************************************************冒泡法改进******************************************************/
设置一个flag,在第二层循环中,若2个数进行了交换,则flag为1;若2个数未进行交换,则flag为0,说明数据已经是按由小到大的顺序进行排列,则不用再进行外层循环。
#include<stdio.h>
void BubbleSort(int a[],int n)
{
int i,j,temp,flag=1;
for(i=0;i<n-1 && flag;i++) //比较的趟数
{
flag=0; //未进行比较,将flag置0
for(j=0;j<n-1-i;j++) //每趟比较的次数
if(a[j]>a[j+1]) //由小到大排序
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1; //若进行了比较,则将flag置1
}
}
}
void main()
{
int a[10],i;
printf("please input 10 numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("The array is:\n");
for(i=0;i<10;i++)
printf("%-4d",a[i]);
BubbleSort(a,10);
printf("\nAfter sort the array is:\n");
for(i=0;i<10;i++)
printf("%-4d",a[i]);
printf("\n");
}