(1)气泡法(用于将一组数据按照从大到小或者从小到大的顺序进行排序)
例题
从键盘上输入10个整数,用起泡法进行从小到大排序。
输入:9 8 7 6 5 4 3 2 1 0 输出: 0 1 2 3 4 5 6 7 8 9
#include<stdio.h>
#define N 10
int main()
{
int a[N],i,j,t;
for(i=0;i<N;i++) scanf("%d",&a[i]);//输入N个数
for(i=0;i<N-1;i++)//进行N-1趟循环
{
for(j=0;j<N-1-i;j++)//在每次循环中进行N-1-i趟比较
{
if(a[j]>a[j+1])//相邻的两项进行比较
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0;i<N;i++)
{
printf("%5d",a[i]);
}
}
就是将相邻的两项进行比较,然后交换位置,当在进行完一正趟比较过后,就会有一个数到达指定位置,所以这个数在接下来的比较当中就不会再出现
(2)选择法(用于将一组数据按照从大到小或者从小到大的顺序进行排序)
例题
从键盘上输入10个整数,用选择法进行从大到小排序。
输入:9 8 6 7 5 4 3 2 1 0 输出: 9 8 7 6 5 4 3 2 1 0
#include<stdio.h>
int main()
{
int n,i,j,a[10],t;
for(i=0;i<=9;i++) scanf("%d ",&a[i]);
for(i=0;i<=8;i++)//因为算出九个数,第十个数就不用算了,所以就算十个数
{
for(j=i+1;j<=9;j++)//因为要从比它大一个的数开始算起,所以要加1,又因为是和除了这个数外的所有数进行比较,所以要比完
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
for(i=0;i<=9;i++) printf("%5d",a[i]);
}
选择法就是将每一个数先单个拎出来,然后用其他的数代替它原来的数,代替完一个数之后这个数就不动了,所以之后进行的比较会越来越少
总结:气泡法和选择法的异同点:
相同点:(1)每一次循环过后都会有一个数据不在变动
(2)第一个循环的个数都是总的数据数减去1,第二个循环都是总的数据减去第一个循环中i的值再减去1
不同点:(1)气泡法只能是相邻两个数进行比较,而选择法则是将一个数据与全部剩余数据进行比较