目录
一、冒泡排序法
1、原理
冒泡排序法是通过将一个最大或者最小的数通过在一组数中进行一次次的比较与交换将该数浮到最右边或者最左边的排序方法,通过将两个相邻的元素进行比较,将较大的值交换到右面(左面)。
冒泡排序的设计原理是,对于n个数对其进行排序,总共要进行n-1次排序,每次排序的次数为n-i次,因为每循环一次,内层所需要比较的次数减一,我们可以使用双重循环的方式,外层循环用来控制循环的趟数,内层循环用来控制每一次循环所需要比较的次数。
中间可以定义一个中间变量n用来实现两个数的交换。
下面以降序排列为例:
1、首先输入十个数,并将这十个数存入数组arr[10]中
printf("请输入十个数:");
for(i=0;i<10;i++)
scanf("%d",arr[i]);
2、然后找出这十个数中的最小数,并将这个数存入arr[9]中;
再找出这十个数中的次小数,并将这个数存入arr[8]中;
......
3、以上过程可以通过以下代码来完成
for(i=0;i<10-1;i++) //由于不需要跟自己比较,因此只需循环10-1次
{
for(j=0;j<10-1-i;j++) //外层每循环一次,内层就少比较一个数
{
if(arr[j]<arr[j+1])
{
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
其中,第二个for循环的花括号删去的话是不会影响程序的运行的,因为如果不添加花括号的话,程序默认只循环for语句下面的第一个语句,而if语句以及其花括号中的语句同属于if语句中,因此将第二个for语句的花括号删除的话,将只循环其下方的if语句
4、最后将排序的最终结果输出
for(i=0;i<10;i++)
printf("%d",arr[i]);
二、源码
完整的代码如下:
#include<stdio.h>
main()
{
int arr[10],i,j,t,m;
printf("请输入十个数:");
for(i=0;i<10;i++)
scanf("%d",&arr[i]); //输入该数组中的十个数
for(i=0;i<10-1;i++) //由于不需要跟自己比较,因此只需循环10-1次
{
for(j=0;j<10-1-i;j++) //外层每循环一次,内层就少比较一个数
{
if(arr[j]<arr[j+1])
{
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
for(m=0;m<10;m++) //输出每次排序的结果
printf("%d ",arr[m]);
printf("\n");
}
printf("最终的排序结果为:");
for(i=0;i<10;i++)
printf("%d ",arr[i]);
}
这个程序是从大到小排序,所以第一轮排序以后,最小的数就会浮到最右面;第二轮排序以后,第二小的数会浮到倒数第二个位置;第三轮排序以后,第三小的数会浮到倒数第三个位置,以此类推。因此,每一次循环结束后都有一个数已经按照需要排好了,所以内层循环比较次数应写为j<10-1-i.
冒泡排序法的优点为:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,因此每一次比较完毕后,下一次只需要比较n-i次即可,以此类推……也就是说,每进行一趟比较,每一趟少比较一次。