冒泡排序(Bubble Sort)
1. 场景分析
场景引入:在上第一节体育课的时候,你作为体育委员需要将班里的同学进行排序,排序的依据是身高。按照你自己的想法,你可以让最高的在最左边,也就是从高到低排列;也可以让最高的站在最右边,也就是从低到高排列。现在比如,让他们集合之后,在排列之前肯定都是高高矮矮参差不齐,你想要把他们按从低到高排列。
例如一共十个人,你从最左边站的一个人开始,左一和左二进行比较身高,左一如果比左二高,那么他们两个交换位置。交换位置之后,左一成了左二,左二再和左三比较,如果左二没有左三高。那么他们两个不交换位置,继续让左三去和左四比较,依次比较,一轮结束之后,最高的肯定在最右边。此时再让左一和左二比较,重复上述,只是不再和最右边的进行比较。
如此循环直到排序完成。
2. 算法原理
- 比较相邻的元素,如果第一个比第二个大(小),就交换他们。如果第一个不比第二个大(小),则不交换,使用第二个去和第三个去进行比较。
- 对每一组相邻元素做同样的工作,从开始第一对到结尾的最后一对。则最后的元素应该会是最大(最小)的数。
- 针对所有的元素重复以上的步骤,除了最后一个
- 持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。
3. 代码实现(C语言)
#include<stdio.h>
void BubbleSort(int* arr, int sz)
{
int i = 0;
int j = 0;
int tmp = 0;//临时用于交换的变量
for (i = 0; i < sz; i++)//用于控制需要进行多少轮的重复过程
{
for (j = 0; j < sz - i - 1; j++)//重复两两进行比较的过程
//sz-1是为了防止数组越界,sz再-i是因为每当一轮结束之后,最后面的数字都是最大或者最小值,不再需要进行比较
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 168,172,165,180,160,179,186 }; //创建一个数组,存放需要排序的数字
int sz = sizeof(arr) / sizeof(arr[0]); //计算数组中一共有多少个元素
int i = 0;
BubbleSort(arr, sz); //排序函数
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]); //遍历数组并且打印。
}
printf("\n");
return 0;
}
4. 阅文集团笔试题
阅文集团2021年大数据开发工程师
冒泡排序
用例1:
输入:20,413,3,53,90,324
输出:[3, 20, 53, 90, 324, 413]
用例2:
输入:20,413,3,53,90,324
输出:[3, 20, 53, 90, 324, 413]
#include<stdio.h>
void BubbleSort(int* arr, int sz)
{
int i = 0;
int j = 0;
int tmp = 0;
for (i = 0; i < sz; i++)
{
for (j = 0; j < sz - i - 1;j++)
{
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
char ch = 0;
int i = 0;
int j = 0;
int arr[20] = { 0 };
int sz = -0;
while (1)
{
scanf("%d", &arr[i]);
i++;
if (getchar() == '\n')
{
break;
}
}
sz = i;
BubbleSort(arr, sz);
printf("[");
for (j = 0; j < sz; j++)
{
printf("%d", arr[j]);
if (j < sz - 1)
{
printf(", ");
}
}
printf("]");
printf("\n");
return 0;
}