解析什么是冒泡排序!

冒泡排序(Bubble Sort)

1. 场景分析

场景引入:在上第一节体育课的时候,你作为体育委员需要将班里的同学进行排序,排序的依据是身高。按照你自己的想法,你可以让最高的在最左边,也就是从高到低排列;也可以让最高的站在最右边,也就是从低到高排列。现在比如,让他们集合之后,在排列之前肯定都是高高矮矮参差不齐,你想要把他们按从低到高排列。

例如一共十个人,你从最左边站的一个人开始,左一和左二进行比较身高,左一如果比左二高,那么他们两个交换位置。交换位置之后,左一成了左二,左二再和左三比较,如果左二没有左三高。那么他们两个不交换位置,继续让左三去和左四比较,依次比较,一轮结束之后,最高的肯定在最右边。此时再让左一和左二比较,重复上述,只是不再和最右边的进行比较。

如此循环直到排序完成。

2. 算法原理

  1. 比较相邻的元素,如果第一个比第二个大(小),就交换他们。如果第一个不比第二个大(小),则不交换,使用第二个去和第三个去进行比较。
  2. 对每一组相邻元素做同样的工作,从开始第一对到结尾的最后一对。则最后的元素应该会是最大(最小)的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个
  4. 持续每次对越来越少的元素重复上面的步骤,知道没有任何一对数字需要比较。

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

排骨炖粉条

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值