vlambda博客
学习文章列表

C语言第一期——冒泡排序

什么是冒泡排序呢?冒泡排序的英语名是Bubble Sort,是一种最基础的交换排序。

大家一定都喝过汽水吧,汽水中常常有许多小小的气泡,往上飘,这是因为组成小气泡的二氧化碳比水要轻,所以小气泡才会一点一点的向上浮。而冒泡排序之所以叫冒泡排序,正是因为这种排序算法的每一个元素都可以向小气泡一样,根据自身大小,一点一点向着数组的一侧移动。冒泡排序可以帮我们解决很多代码问题,例如高低个子排队啊,除去最大最小值平均数了等等好多种奇怪的问题,几乎很多有关排序的算法都可以用冒泡排序解决,代码简单易理解,只能说冒泡YYDS。

具体如何移动呢?我们来看一下例子:


有8个数组组成一个无序数列:5,8,6,3,9,2,1,7,希望从大到小排序。按照冒泡排序的思想,我们要把相邻的元素两两进行比较,根据大小交换元素的位置,过程如下:

第一轮排序:

1、首先让5和8进行比较,发现5比8小,因此元素位置不变。

2、接下来让8和6比较,发现8比6大,所以要交换8和6的位置。


C语言第一期——冒泡排序

 3、继续让8和3比较,发现8比3要大,所以8和3 交换位置。

C语言第一期——冒泡排序

 4、继续让8和9进行比较,发现8比9小,不用交换

 5、9和2进行比较,发现9比2大,进行交换

C语言第一期——冒泡排序

6、继续让9和1进行比较,发现9比1大,所以交换9和1的位置。

C语言第一期——冒泡排序

7、最后,让9和7交换位置

C语言第一期——冒泡排序

这样一来,元素9作为数列的最大元素,就已经排序好了。

 下面我们来进行第二轮排序:

1、首先让5和6比较,发现5比6小,位置不变

2、接下来让6和3比较,发现6比3大,交换位置

C语言第一期——冒泡排序

3、接下来让6和8比较,6比8小,位置不变

4、8和2比较,8比2大,交换位置

C语言第一期——冒泡排序

5、接下来让8和1比较,8比1大,因此交换位置

C语言第一期——冒泡排序

6、继续让8和7比较,发现8比7大,交换位置

C语言第一期——冒泡排序

第二轮的状态为:

C语言第一期——冒泡排序

第三轮的状态为:

C语言第一期——冒泡排序

第四轮的状态为:

C语言第一期——冒泡排序

第五轮的状态为:

C语言第一期——冒泡排序

第六轮的状态:

C语言第一期——冒泡排序

第七轮状态为:(已经有序了)

C语言第一期——冒泡排序

第八轮的状态为:

C语言第一期——冒泡排序

到此为止,所有的元素都是有序的了,这就是冒泡排序的整体思路。

但是,从第七次循环开始就已经有序了,第八次的循环判断完全是浪费时间,所以我们加一个flags变量来检查我们的循环判断是否有进行数据交换,若有flags进行记录,下一次循环仍进行,若没有进行数据交换说明数列已经有序了,下一次循环就不用进行了(此处用了注释)。

代码:

#include<stdio.h>

#include<stdlib.h>


void BubbleSort(int a[], int len)

{

         int i, j, temp;

         for (j = 0; j < len - 1; j++)

         {

//int flags=0;

                  for (i = 0; i < len - 1 - j; i++)

                  if (a[i] > a[i + 1])

                  {

                          temp = a[i];

                          a[i] = a[i + 1];

                          a[i + 1] = temp;

//flags=1;

                  }

//if(flags==0)

//return ;

         }

}


int main()

{

         int arr[] = { 5, 8, 6, 3, 9, 2, 1, 7 };

         int len = sizeof(arr) / sizeof(arr[0]);

         int i = 0;

         printf("排序前:");

         for (i = 0; i < len; i++)

         {

                  printf("%d ", arr[i]);

         }

         printf("\n");


         BubbleSort(arr, len);

         printf("排序后:");

         for (i = 0; i < len; i++)

         {

                  printf("%d ", arr[i]);

         }

         printf("\n");

         system("pause");

         return 0; 

}

   

下面大家可以用冒泡排序求解下面这道题:

1.      初阶只需要给小朋友进行排序即可;

2.      进阶可以加上小朋友的不高兴度。


C语言第一期——冒泡排序



C语言第一期——冒泡排序
欢迎扫码关注我们哦

来源:电子协会软件开发部

本期编辑:郭志豪

审核:郑栋方