冒泡排序详解

目录

一、冒泡排序的概念:

二、冒泡排序名字的由来:

三、冒泡排序算法思路:

四、如何确定外排序,内排序的次数(排除特殊情况版本):

五、举例代码实现:


一、冒泡排序的概念:

可以理解为鱼吐泡泡(大泡泡在最上面)

冒泡排序是依次进行比较,比如一数据63974,使用冒泡排序的话就是先将63进行比较比较出大的,然后在用大的和后面的进行比较,6和3比,6大,6在和9进行比较,以此类推,所以冒泡排序的话最上面的一定是最大的,比较交换位置的时候,比如说6和3,要先将3拿出来放在一个容器中,然后将6放在3 的位置上,再将3拿出来放在6的位置上,这就完成了一次冒泡排序,所以如果使用冒泡对一个数据进行排序的话,有可能会冒泡排序很多次

冒泡排序一次会确定一个关键字的位置,另外冒泡排序是稳定的排序

二、冒泡排序名字的由来:

冒泡排序是一种计算机科学领域的较简单的排序算法,它重复的第走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小,首字母从Z到A)错误就把它们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成,这个算法的名字由来是因为越小的元素会经由交换慢慢浮到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”

三、冒泡排序算法思路:

每一次冒泡排序都会排出一个最大的,这个最大的元素一定是在下标为n-1的位置上,第二大的元素在下标为n-2的位置

因为冒泡排序就是不断的进行多次的排序,每次排出一个最大的,经过不停的操作之后,最大数依次被排出,当数组中的数据为升序或者降序的时候,就意味着我们排序成功了,既然是进行多次排序,那么对于一个元素个数为n的数组,究竟要进行什么样的排序呢,这里我们分为外排序次数和内排序次数。

外排序次数是指对要排序的这个数组整体进行排序的次数。

内排序的次数是指对数组内部的元素顺序进行调节的次数。

举个例子:

学校要举行月考,班主任要求你布置考场,你来到考场按学号的顺序摆放桌子,你速度很快,十几分钟就调节好了桌子的顺序,你开心的离开了教室,不过在路上,你猛然的发现:好像有一排的桌子忘记按学号位置摆放了,你又马上返回到了教室,对桌子的顺序进行了第二次的调节,在这里,马上返回到了教室就是外排序,外排序的次数为2,因为是两次回到教室,对桌子的顺序进行了第二次调节就是内排序,内排序的次数就要根据教室里的桌子里的个数计算了,以冒泡排序的原理计算挪动桌子的次数,挪动桌子的次数就是内排序了,内排序也可以理解为每次外排序做的操作

四、如何确定外排序,内排序的次数(排除特殊情况版本):

我们现在已经知道了,冒泡排序要进行外排序和内排序,那么如何确定具体的次数呢,我们这里所研究的具体次数是排除了特殊情况的,因为有可能你要排的数组,已经就是排序好了,但是我们又不知道数组中有哪些的数组元素被排序好了,所以我们就不能总结出一个适用于大范围的规律了。

比如说对一个数组元素个数为n的数组进行冒泡排序,由于每一次外排序都会排出一个最大的数,确定一个数的位置,那么最后一次外排序,其实是可以一次确定2个元素的位置,因为最后一次外排序就排两个元素就可以了,确定了一个的位置,另一个也就确定了,所以外排序环的次数也就确定了,是n-1次。

然后我们在看内排序:每一次的外排序都做了什么

第一次外排序,内排序的次数为n-1次(比如2,3,6。 要将23比较,然后在将36比较,元素个数n为3,比较次数也就是内排序次数n-1为2)

第二次外排序,内排序的次数为n-2次(因为第一次外排序已经排出了一个最大的数了,第二次外排序就可以不用排他,只需要排剩下的元素就可以了)

第三次外排序,内排序的次数为n-3次

.........

第n - 1次外排序,内排序的次数为n - (n-1)(对于一个元素个数为n的数组,进行的外排序的次数为n-1)

确定了外排序和内排序,那么接下来,我们只要在内排序和外排序中比较数组元素大小就完事了

五、举例代码实现:

#include<iostream>
#include<string>
using namespace std;
void bubble_sort(int arr[], int size)//一个用来接收数组元素,一个用来接收数组元素的个数
{
	for (int i = 0; i < size - 1; i++)//外排序的次数
	{
		for (int j = 0; j < size - 1 - i; j++)//内排序的次数
		{
			if (arr[j]>arr[j + 1])//前面的数比后面的大
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j + 1] = temp;
			}
				

		}
	}

}
//可以稍微做一下优化:将temp和j在for循环之前就定义了,这样系统就不用在if里面进行申请内存,释放内存了,就可以在整个函数结束之后回收内存了
//可以少做一点事情了就。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

翘指

创作不易,一分也是爱

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

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

打赏作者

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

抵扣说明:

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

余额充值