冒泡排序是一种比较简单的排序,就像冒泡泡一样。
比如给5个数排序,升序排列;
5 9 2 4 1;
泡泡第一次归位!!首先让泡泡在5下面;
5 9 2 4 1;
。
第一次 5与9比大小; 5比9小 ,不交换,泡泡冒到了9上;
5 9 2 4 1;
。
第二次 9与2比较大小; 9比2大,交换;
5 2 9 4 1;
。
第三次 9与4比较大小;9比4大,交换;
5 2 4 9 1;
。
第四次 9与1比较大小;9比1大,交换;
5 2 4 1 9;
。
此时 最大的数字已经浮出水面,第二次泡泡归位!
5 2 4 1 9;
。
第一次 5与2比较,5比2大,交换;
2 5 4 1 9;
。
第二次 5与4比较,5比4大,交换;
2 4 5 1 9;
。
第三次 5与1比较,5比1大,交换;
2 4 1 5 9;
。
此时已经不需要比较了 在第三次时已经把 此组数中的第二大的数字选了出来!
泡泡第三次归位!
2 4 1 5 9;
。
第一次 2与4比较 ,2比4小 不交换,泡泡冒到了4上;
2 4 1 5 9;
。
第二次 4与1比较,4比1大 交换;
2 1 4 5 9;
。
此时已经把5个数中的 第三大的数字选出来了!
第四次泡泡归位!
2 1 4 5 9;
。
第一次 2与1比较 2比1大,交换
1 2 4 5 9;
。
此时已经排列成功了!!
让我们总结下
每个冒泡的循环中 都将最大的那个数冒到了最后,
经过一次冒泡 比较的次数减了一,因为无需比较已经选出的最大数;
5个数字我们经过了4次泡泡归位
那么 我们将5个数字扩展到n个数字呢?
首先
要经过n-1次泡泡归位;每归一次位,比较的次数减一
如下是c语言代码
#include <stdio.h>#include <stdlib.h>
#define n 5//宏定义一个n值
int main()
{
int a[n]={5,9,2,4,1};
int i;//i控制泡泡泡泡归位
int j,t;//t为交换变量,j控制了比较的数字
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)//每次泡泡归位 比较次数比以前减一 所以先减一再减i
{
if(a[j]>a[j+1])//交换条件,决定你时升序还是降序;
{
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
}
for(i=0;i<n;i++)
{
printf("%d",a[i]);
}
return 0;
}