冒泡排序算法
一、什么是冒泡排序法:
对于一组数据:3, 6 , 2 ,9 , 4, 7, 1, 0, 8, 5, 10,要将这些数据按照从小到大的顺序进行排序,可以使用冒泡排序法。
首先:将第一个数字和第二个数字进行排序,如果第一个数字大于第二个数字,交换位置。
其次:将第二个数字和第三个数字进行排序,如果二大于三,则交换位置。
最后,将倒数第二个和倒数第一个进行排序,如果倒数第二个大于倒数第一个,则交换位置。
这样操作之后,我就会把最大的数字排到最后面。
之后:我再从头开始,这回把第二大的排到倒数第二个位置上......最后我只需要找到倒数第二小的数字,相应的也就确定了最小的数字,整个数列排序完毕。
通过上面的例子我们可以发现:排最大的进行一轮,排第二大进行一轮,最后排第二小的进行一轮,总共进行了10轮。
每一轮中都是不同的位置上面进行比较,因此可以分析出来,外层循环的是轮数,内层循环的是位置(下标)
二、通过一个程序来理解:
//冒泡排序的案例
#include <stdio.h>
int main(void)
{
int names[11]={3,6,2,9,4,7,1,0,8,5,10};
int dates[11];
for (int i=0;i<11;i++)
{
dates[i]=names[i];
}
int out_i;
int in_i;
for (out_i=0;out_i<10;out_i++)//out_i是轮数
{
for (in_i=0;in_i<10-out_i;in_i++) //in_i表示的是位置,in_i最后所抵达的位置和轮数有关,例:第一轮比较出最大的了,
//第二轮就不用和最后位置进行比较,因此相应的位置也减少一位,即减去轮数。每次都从第一个开始,所以初始值是0 ,当
//out_i=0时,in_i+1最大到最后一个,in_i也就是只能到倒数第二个,也就是位置9,此时是<10-0。
{
if(dates[in_i]>dates[in_i+1])
{
int agent;
agent=dates[in_i];
dates[in_i]=dates[in_i+1];
dates[in_i+1]=agent;
}
}
}
printf("print the changed array:\n");
for (int n=0;n<11;n++)
{
printf("dates[%d]=%d\n",n,dates[n]);
}
printf("print the original array:\n");
for(int n=0;n<11;n++)
{
printf("names[%d]=%d\n",n,names[n]);
}
return 0;
}
打印结果如下:
print the changed array:
dates[0]=0
dates[1]=1
dates[2]=2
dates[3]=3
dates[4]=4
dates[5]=5
dates[6]=6
dates[7]=7
dates[8]=8
dates[9]=9
dates[10]=10
print the original array:
names[0]=3
names[1]=6
names[2]=2
names[3]=9
names[4]=4
names[5]=7
names[6]=1
names[7]=0
names[8]=8
names[9]=5
names[10]=10

浙公网安备 33010602011771号