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的位置。
3、继续让8和3比较,发现8比3要大,所以8和3 交换位置。
4、继续让8和9进行比较,发现8比9小,不用交换
5、9和2进行比较,发现9比2大,进行交换
6、继续让9和1进行比较,发现9比1大,所以交换9和1的位置。
7、最后,让9和7交换位置
这样一来,元素9作为数列的最大元素,就已经排序好了。
下面我们来进行第二轮排序:
1、首先让5和6比较,发现5比6小,位置不变
2、接下来让6和3比较,发现6比3大,交换位置
3、接下来让6和8比较,6比8小,位置不变
4、8和2比较,8比2大,交换位置
5、接下来让8和1比较,8比1大,因此交换位置
6、继续让8和7比较,发现8比7大,交换位置
第二轮的状态为:
第三轮的状态为:
第四轮的状态为:
第五轮的状态为:
第六轮的状态:
第七轮状态为:(已经有序了)
第八轮的状态为:
到此为止,所有的元素都是有序的了,这就是冒泡排序的整体思路。
但是,从第七次循环开始就已经有序了,第八次的循环判断完全是浪费时间,所以我们加一个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. 进阶可以加上小朋友的不高兴度。
来源:电子协会软件开发部
本期编辑:郭志豪
审核:郑栋方