冒泡排序(超详细图解加代码解析,5分钟看懂)

这篇具有很好参考价值的文章主要介绍了冒泡排序(超详细图解加代码解析,5分钟看懂)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

冒泡排序(超详细图解加代码解析,5分钟看懂)

 目录

1.冒泡排序的定义

2.冒泡排序的原理

3.代码及其解析

4.冒泡排序的改进

5.实现冒泡排序函数


生命中永远会有令人懊恼的事,但我知道,我们是为了不留遗憾活着的,对吗?

1.冒泡排序的定义

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

2.冒泡排序的原理

假设要将已知无需数列按从小到大排列,将第一个元素与后面的元素依次比较,如果必后面的元素小,就与后面某个元素交换位置,然后用这个元素再依次往后比较,遇到比这个元素小的就与这个元素交换,直到最后一个元素,就完成了一趟冒泡排序,则最后一个元素一定是这个序列里最大的一个元素;然后开始第二趟冒泡排序,继续从第一个元素开始往后一次比较,遇到较小的就交换位置,直到倒数第二个数,那么最后倒数第二个数就变成了第二大的数.......依次排完序列中所有的数,那么这个数的顺序就会变成从小到大,下面我用图来演示

第一趟冒泡排序,是对序列中所有数进行操作

冒泡排序(超详细图解加代码解析,5分钟看懂)

第 i 趟冒泡排序,是对序列中除最后一个数外(10-i)个数进行操作

冒泡排序(超详细图解加代码解析,5分钟看懂)

3.代码及其解析

#include<stdio.h>
int main()
{
	int arr[10] = { 10,9,8,7,6,11,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组元素个数
	int i = 0;
	printf("排序前的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	printf("排序后的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

冒泡排序(超详细图解加代码解析,5分钟看懂) 代码解析:外部循环控制冒泡排序的趟数,for循环从0开始,循环sz-1(数组元素-1)次,内部循环控制每次具体的冒泡排序过程,因为每趟冒泡排序需要进行比较的次数递减,所以在循环的控制条件那再减去i来控制每趟冒泡排序进行的比较次数。在内部循环的循环体内,对这趟冒泡排序需要排序的元素进行遍历,小的元素放前面,大的逐次往后走,没趟冒泡结束后都能确定一个元素的位置。(sz-1)趟冒泡排序结束后,冒泡排序及就结束了。当然,如果想进行从大到小排序,只需要改变冒泡排序的判断部分,将大的元素放前面,小的元素往后走即可,代码如下:

#include<stdio.h>
int main()
{
	int arr[10] = { 10,9,8,7,6,11,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组元素个数
	int i = 0;
	printf("排序前的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	printf("排序后的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

冒泡排序(超详细图解加代码解析,5分钟看懂)

4.冒泡排序的改进

由于冒泡排序的时间复杂度实在太高,所以冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。 

#include<stdio.h>
int main()
{
	int arr[10] = { 10,9,8,7,6,11,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组元素个数
	int i = 0;
	printf("排序前的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	int flag = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] >arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag++;
			}
		}
		if(flag==0)
		break;
	}
	printf("排序后的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

方法就是在每次冒泡后,检验一下到底这趟冒泡排序有没有交换顺序,如果没有的话,那么flag的值没有发生变化,就可以直接退出循环,这种方法可以略微提升一下效率。 

5.实现冒泡排序函数

用函数实现冒泡排序,传参方法跟数组传参相同,具体可参考C语言函数详解​​​​​​

里面有具体介绍数组传参的方法,这里就直接上代码

#include<stdio.h>
void Bubble_Sort(int arr[], int sz)
{
	int flag = 0;
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flag++;
			}
		}
		if (flag == 0)
			break;
	}
 
}
int main()
{
	int arr[10] = { 10,9,8,7,6,11,4,3,2,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);//计算出数组元素个数
	int i = 0;
	printf("排序前的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	Bubble_Sort(arr, sz);
	printf("排序后的数组:");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

冒泡排序(超详细图解加代码解析,5分钟看懂)

本文收录于基础算法 、C语言学习专题 、水火莲花-C疑难专题文章来源地址https://www.toymoban.com/news/detail-513044.html

到了这里,关于冒泡排序(超详细图解加代码解析,5分钟看懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言版--单链表排序,冒泡排序,选择排序,插入排序,快速排序,应有尽有,保证看懂,没有bug!交换节点版本!

    你好                 如果复制时发现有缩进报错,后者空格报错等问题,以VScode为例,可以按Ctrl+F,复制一个报错的空格,然后替换成一个手打的空格键,具体操作可以搜搜,可以看我的博客。 具体截图:以 12 34 78 56 23 99 34 12 45 76为例,其他朋友可以自己举 选择排序

    2024年02月03日
    浏览(36)
  • python pytorch 超详细线性回归原理解析加代码实现-小白入门级

    答应老师做的一个系列教程,也是头一次花这吗大精力去写一篇基础的文档,里面虽然有不少的公式,但只要能顺着看下来会发现都是非常基础的公式都是特别简单的。 学习目标: 了解深度学学习的结构基本过程和原理 模型(函数): f ( x ) = w x + b f(x)=wx+b f ( x ) = w x + b 数据集

    2024年02月02日
    浏览(39)
  • 图解基础排序算法(冒泡、插入、选择)(山东大学实验二)

      目录 ⚽前言: 🏐 冒泡排序: 设定: 分类: 起源: 图解冒泡: 图中绿色: 图中橙色: 整体思路: 交换思路: 核心代码:  🏀 图解插入: 设定: 插入思路: 整体思路: 核心代码: 🥎图解选择:  设定: 整体思路: 核心代码:  🎱山东大学实验二完整代码: 

    2024年01月17日
    浏览(65)
  • 【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

    目录 1、归并排序  1.1、算法描述  1.2、图解说明 2、代码实现  3、master公式 3.1、公式以及结论 3.2、适用于某些特殊的递归 3.3、计算归并排序的时间复杂度 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用 递归 或者说是 分治法 (Divide and Conquer)的一个非

    2024年02月08日
    浏览(56)
  • MQTT协议图解,一文看懂MQTT协议数据包(真实报文数据解析解释)

    本文主要介绍MQTT协议的结构和具体的2条报文数据解析,帮忙更简单、快速地理解mqtt协议,如果要深入了解实现完整的协议,可以查看文章最后的完整协议文档做更深入的研究。 MQTT协议在lot领域是使用的最广泛的通用协议,在一般企业级物联网产品开发中,通常会考虑的协

    2023年04月16日
    浏览(40)
  • 【算法系列 | 1】深入解析排序算法之——冒泡排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月08日
    浏览(55)
  • 【算法系列 | 1】深入解析排序算法之冒泡排序

    你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级论点 蓝色 :用来标记二级论点 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力

    2024年02月07日
    浏览(45)
  • java冒泡排序(含冒泡排序代码)

    目录 一:冒泡排序思想 二:冒泡排序代码 三:结果  

    2024年02月14日
    浏览(42)
  • 排序算法之冒泡排序(详细版)

    📝个人主页:爱吃炫迈 💌系列专栏:数据结构与算法 🧑‍💻座右铭:快给我点赞赞💗 冒泡排序 (Bubble Sort)***,是一种计算机科学领域的较简单的排序算法。 它 重复地走访 过要排序的元素列表, 依次比较两个相邻 的元素,如果顺序(如从大到小、首字母从Z到A)错误

    2023年04月26日
    浏览(34)
  • JavaScript排序算法大解密 - 冒泡、选择、插入、快速排序全解析

    📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 📢 Krpano专栏:想学VUE的,冲这里 🔔 上述专栏,都在不定期持续更新中!!!! 目录 ✨ 前言 冒泡排序 选择排序 插入排序 快速排序 ✨ 结语

    2024年01月17日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包