C语言 一篇看懂冒泡排序算法<Bubble Sort>具体实现

冒泡排序算法 Bubble Sort

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

算法思想

冒泡排序算法的核心思想是:越大的元素会由交换慢慢“浮”到数列的顶端。就想鱼吐泡泡一样,慢慢浮到水面上。
冒泡排序的核心就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。然后对此步骤进行重复,直到把每个元素都放好位置。如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变。
这个算法就像小时候在操场排队排队,老师总是说:“高的站前面,低的站后面”。我们一开始并不一定会站到准确的位置上,老师又说:“你比前面的高,和前面的换换,还高,再和前面换换”,就这样找到了自己的位置。

排序过程

排序过程以数组int arr[] = {23,94,61,35,49,10,55,87,73};用冒泡排序法将其从小到大排序为例。
①:确定要排序的数组,和从小到大还是从大到小排序。(以从小到大举例)
②:比较相邻的元素。如果第一个比第二个大,就交换他们两个。
③:对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
④:针对所有的元素重复以上的步骤,除了最后一个。
⑤:持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
在这里插入图片描述

代码示例



#include <stdio.h>
int main()//bubble sortCSDN
{//from smallest to largest
	int arr[] = {23,94,61,35,49,10,55,87,73};
	int size = sizeof(arr) / sizeof(int);
	int i, j;
	int a = size;
	while (a > 1)//判断,如果数组元素只有一个,则没有排序必要
	{
		// 外层循环控制冒泡排序的趟数
		// size-1表示:最后一趟区间中只剩余1个元素,该趟冒泡可以省略
		for (i = 0; i < size; i ++)
		{
			int count = 0;
			// 具体冒泡的方式:用相邻的两个元素进行比较,
			//前一个大于后一个元素时,交换着两个数据,依次直到数组的末尾
			for (j = 1; j < size - i; j ++)
			{
				if (arr[j - 1] > arr[j])//如果想要从大到小排序则改变这里的判断条件
				{
					int tmp = arr[j - 1];
					arr[j - 1] = arr[j];
					arr[j] = tmp;
					count = 1;// 如果本次冒泡进行数据交换了,说明本次还是无序的,就将count设置为1
				}
			}
			//这种for循环或者上面的for循环都可以
			/*for (j = 0; j < size -1 - i; j ++)
			{
			if (arr[j] > arr[j + 1])
			{
			int tmp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
			count = 1;
			}
			}*/
			if (count == 0)
			{//如果本次冒泡中,元素没有交换,则本次开始冒泡时,数据已经有序了,后面的冒泡可以不用进行了
				break;
			}
		}
		a --;
	}
	for (i = 0; i < size; i ++)//输出打印排好序的数组内容
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

输出:

10
23
35
49
55
61
73
87
94
请按任意键继续. . .

过程分析

遍历数组,对数组中相邻的两个元素进行比较,如果需要升序,前一个数据大于后一个数据时,交换两个位置上的数据,直到所有的数据比较完,此时,最大的数据已经放在数组的末尾。
这样的一次遍历,除最大数据已经排好序外,其余数据还是无序的。继续对剩余数据采用与上述类似的方式进行处理即可。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

算法复杂度

时间复杂度:

通过冒泡排序的算法思想,我们发现冒泡排序算法在每轮排序中会使一个元素排到一端,也就是最终需要 n-1 轮这样的排序(n 为待排序的数列的长度),而在每轮排序中都需要对相邻的两个元素进行比较,在最坏的情况下,每次比较之后都需要交换位置,所以这里的时间复杂度是 O(n2)。其实冒泡排序在最好的情况下,在待排序的数列本身就是我们想要的排序结果时,时间复杂度是 O(n),因为只需要一轮排序并且不用交换。
综上,因此冒泡排序总的平均时间复杂度为O(n2)

空间复杂度:

对于空间复杂度来说,冒泡排序用到的额外的存储空间只有一个,那就是用于交换位置的临时变量,其他所有操作都是在原有待排序列上处理的,所以空间复杂度为 O(1)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值