C语言冒泡排序算法是什么?一文详解原理与代码实现

 更新时间:2026年09月30日 10:05:38   作者:Space-oddity-fang  
还在为冒泡排序发愁?本文用通俗语言讲解冒泡排序的基本思想,通过实例演示如何将无序数组从小到大排列,并提供可复用的Java代码,同时介绍flag标志优化,减少不必要的比较,提升排序效率,无论你是初学者还是准备面试,都能快速掌握冒泡排序的核心要点

排序算法的介绍

排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。

排序的分类

内部排序

指将需要处理的所有数据都加载到**内部存储器(内存)**中进行排序。

外部排序法

数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。

【重点】冒泡排序

1.基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐 向上冒。

因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

2.冒泡排序应用实例

将五个无序的数:{3, 9, -1, 10, -2},使用冒泡排序法将其排成一个从小到大的有序数列。

3.分析冒泡的过程+代码

代码实现:

#include <stdio.h>
int main(){
	
	int arr[] = {3,9,-1,10,-2};
	
	//第一轮排序
	
	int j;
	int t;//临时变量
	for(j=0;j<4;j++){
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第一轮的排序后的情况
	for(j=0;j<5;j++){
		printf(" %d",arr[j]);	
	}
	printf("\n");
	//第二轮排序
	for(j=0;j<3;j++){
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第二轮的排序后的情况
	for(j=0;j<5;j++){
		printf(" %d",arr[j]);	
	}
	printf("\n");
	
	//第三轮排序
	for(j=0;j<2;j++){
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第三轮的排序后的情况
	for(j=0;j<5;j++){
		printf(" %d",arr[j]);	
	}
	
	printf("\n");
	//第四轮排序
	for(j=0;j<1;j++){
		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
		}
	}
	//输出看看第四轮的排序后的情况
	for(j=0;j<5;j++){
		printf(" %d",arr[j]);	
	}
	return 0;
}

因为每轮排序几乎一样,因此我们可以使用for循环来处理,进行精简代码,同时定义一下数组大小的变量,arrLen,让代码更灵活

#include <stdio.h>
int main(){
	
	int arr[] = {3,9,-1,10,-2};
	
	//因为每轮排序几乎一样,因此,我们可以使用for循环处理
	
	//第一轮排序
	
	int j,i;
	int t;//临时变量
	int arrLen = sizeof(arr) / sizeof(int); // 5 数组大小
	for(i=0;i<arrLen-1;i++){
		for(j=0;j<arrLen-1-i;j++){		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
			}
		}
		//输出看看第一轮的排序后的情况
		for(j=0;j<arrLen;j++){
			printf(" %d",arr[j]);	
		}
		printf("\n");	
	}
	return 0;
}

因为每次重复写代码太过麻烦,可以将上述代码封装成冒泡排序的函数:

#include <stdio.h>
//冒泡排序的函数
void bubbleSort(int arr[],	int arrLen){
	
	int j,i;
	int t;//临时变量	
		//因为每轮排序几乎一样,因此,我们可以使用for循环处理
	for(i=0;i<arrLen-1;i++){
		for(j=0;j<arrLen-1-i;j++){		
		//如果前面的数大于的后面的数,就交换
		if(arr[j]>arr[j+1]){
			t = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = t;
			}
		}	
	}
}

int main(){
	
	int j;
	int arr[] = {3,9,-1,10,-2};
	int arrLen = sizeof(arr) / sizeof(int); // 5 数组大小
	bubbleSort(arr,arrLen);//数组默认是地址传递 (指针)
	printf("\n排序后(函数)\n");
		for(j=0;j<arrLen;j++){
			printf(" %d",arr[j]);	
		}

	return 0;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Qt图形图像开发之曲线图表模块QChart库读取/设置X轴的显示区间

    Qt图形图像开发之曲线图表模块QChart库读取/设置X轴的显示区间

    这篇文章主要介绍了Qt图形图像开发之曲线图表模块QChart库读取/设置X轴的显示区间,需要的朋友可以参考下
    2020-03-03
  • Visual Studio调试C/C++教程指南

    Visual Studio调试C/C++教程指南

    VisualStudio是微软开发的一款集成开发环境软件,本文主要介绍了Visual Studio调试C/C++教程指南,熟悉地掌握基于VS的C/C++调试技术,可以大幅提升调试性能,感兴趣的可以了解一下
    2024-06-06
  • 详解C++ const修饰符

    详解C++ const修饰符

    const 是 constant 的缩写,const可以帮我们避免无意之中的错误操作,本文给大家介绍C++ const修饰符的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-05-05
  • 用C语言递归实现火车调度算法详解

    用C语言递归实现火车调度算法详解

    本文主要介绍了用C语言递归实现火车调度算法详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C++中std::stringstream多类型数据拼接和提取用法小结

    C++中std::stringstream多类型数据拼接和提取用法小结

    本文主要介绍了C++中std::stringstream多类型数据拼接和提取用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C++实现线程池的简单方法示例

    C++实现线程池的简单方法示例

    这篇文章主要给大家介绍了关于C++实现线程池的简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • C++利用SQLite实现命令行工具

    C++利用SQLite实现命令行工具

    这篇文章主要为大家详细介绍了一个基于 C++、SQLite 和 Boost 库的简单交互式数据库操作 Shell,该 Shell 允许用户通过命令行输入执行各种数据库操作,感兴趣的可以了解下
    2023-11-11
  • C++编写简单的打靶游戏

    C++编写简单的打靶游戏

    这篇文章主要介绍了使用C++编写简单的打靶游戏,本人也是个菜鸟,水平有限,有错误遗漏的地方在所难免,大家看看就好。
    2015-03-03
  • 详解c++20协程如何使用

    详解c++20协程如何使用

    这篇文章主要介绍了详解c++20协程如何使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++实现简单插件机制原理解析

    C++实现简单插件机制原理解析

    这篇文章主要介绍了C++实现简单插件机制原理解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02

最新评论