冒泡排序法所谓就是把所有需要排序的元素都走一遍,进行比较。
冒泡原理(从小到大举例)如下:
1、先比较前两个元素。如果第一个比第二个大,就交换他们两个。;
2、对每一对相邻元素都重复1的操作,从开始到最后,所有的相邻元素对都会被比较并交换,最后一个元素为最大;
3、对所有的元素都进行1和2的操作,每次比较后最大的都会被放在最后。
随着比较,每次需要比较的元素会越来越少,知道最后停止比较。
用一组数据来解释冒泡排序法如何操作:
{20,12,8,10}
i \ j | 0 | 1 | 2 | |
0 | 20和12进行比较互换: {12,20,8,10} | 20和8进行比较互换: {12,8,20,10} | 20和10进行比较互换: {12,8,10,20} | 最后一位保留,20不用参与下次一比较 |
1 | 12和8进行比较互换: {8,12,10} | 12和10进行比较互换: {8,10,12} | 12不用参与下一次比较 | |
2 | 8和10比较互换: {8,10} | 10 |
在循环中,i<数组个数-1(表中也可以看出);
j<数组个数-1-i(第0趟,j需要循环0,1,2(4-1-0)次;
第1趟,j需要循环0,1(4-1-1)次;
第2趟,j需要循环0(4-1-2)次);
通过上面表格,可以直观理解冒泡排序,下面通过代码实现。
#include <stdio.h>
int main()
{
int i,j;
int array[]={13,24,9,14,5};//给定数组的数据,可以替换不同的数据
int len= sizeof(array)/sizeof(array[0]);//定义并计算数组个数
int temp;
for(i=0;i<len-1;i++){ //外循环,排序趟数
for(j=0;j<len-1-i;j++){ //内循环,每趟排序的次数
if(array[j]>array[j+1]){ //相邻元素进行比较,由小到大是'<',由大到小是'>'
temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
for(i=0;i<len;i++){ //循环,输出数组中的元素
printf("%d ",array[i]);
}
return 0;
}