当前位置: 首页 > news >正文

(C语言)分享代码 冒泡排序

冒泡排序:

冒泡排序是一种简单且基础的排序算法,其核心思想是通过多次遍历待排序的数组,比较相邻元素并交换顺序,使较大的元素逐渐“冒泡”到数组的末尾。这种算法因其名字来源于气泡的上升运动而得名。 

#include <stdio.h>
void pai(int arr[],int n)
{
	int i,j,temp;
	for (i = 0;i < n - 1;i++)   //控制进行次数
	{
		for (j = 0;j < n - 1;j++)   //进行排序
		{
			if (arr[j] > arr[j+1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
void print(int arr[], int n)
{
	for (int i = 0;i < n; i++)     //输出arr[]
	{
		printf("%d ", arr[i]);
		//printf("\n");
	}
}
int main()
{
	int arr[6] = { 33,44,1,0,44,999 };
	int n = sizeof(arr) / sizeof(arr[0]);
	printf("未排序数组: \n");
	print(arr, n);
	pai(arr, n);
	printf("\n");
	printf("排序后数组: \n");
	print(arr, n);
	return 0;

}

冒泡排序的基本原理

  1. 比较相邻元素:从数组的第一个元素开始,依次比较相邻的两个元素。如果前一个元素大于后一个元素,则交换它们的位置。
  2. 重复遍历:每一轮遍历结束后,最大的元素会被放置在数组的末尾。因此,下一轮遍历可以减少一次比较,因为最后一个元素已经是最大的。
  3. 终止条件:当某一轮遍历中没有发生任何交换时,说明数组已经完全有序,可以提前结束排序。

上述代码中,外层循环控制排序的轮数,内层循环负责比较和交换。 

代码详解

  1. 外层循环:控制排序的轮数,每一轮将未排序部分的最大值“冒泡”到末尾。
  2. 内层循环:负责比较和交换相邻元素。每一轮内层循环的范围逐渐减少,因为每轮结束后最后一个元素已经是最大的。
  3. 交换操作:使用临时变量 temp 来交换两个元素的位置。

现在的冒泡排序有什莫问题吗?

答案是有的!!

现在的冒泡排序如果遇到已经排序好的数组如:

arr[5]={1,2,3,4,5};

遇到这种的代码 现在的冒泡排序仍然会进行许多次, 进行n-1次。

这样的代码太过于拖沓了,可以进行优化。

优化冒泡排序:

  1. 添加标志位:在某一轮遍历中如果没有发生任何交换,说明数组已经有序,可以提前结束排序。
  2. 减少不必要的比较:在每轮遍历中记录最后一次交换的位置,下一轮从该位置开始比较。

优化后的代码如下:


void pai(int arr[], int n) {
    int i, j, temp, swapped;
    for (i = 0; i < n - 1; i++) {
        swapped = 0;
        for (j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;
            }
        }
        // 如果没有发生交换,说明数组已有序
        if (!swapped) break;
    }
}

总结

冒泡排序是一种简单直观的排序算法,适合初学者学习和理解排序的基本原理。尽管其效率较低,但在小规模数据或教学场景中仍然具有一定的应用价值。通过优化,可以进一步提高其性能,但其基本思想和实现方式仍然保持不变

http://www.dtcms.com/a/86585.html

相关文章:

  • 借助mitmproxy通过电子邮件隐式传输信息
  • Android开发检查是否开启通知栏权限
  • Elasticsearch未授权访问漏洞
  • Android Token的原理和本地安全存储
  • C++基础 [八] - list的使用与模拟实现
  • LeetCode热题100精讲——Top2:字母异位词分组【哈希】
  • 鲲鹏服务器,系统为:openEuler22.03-LTS (aarch64)Dify 安装教程(详细版)
  • 开发中常用的设计模式 用法及注意事项【面试题】
  • 路由工程师大纲-2:结合AI技术构建路由拓扑与BGP异常检测的知识链体系
  • (UI自动化测试web端)第二篇:元素定位的方法_xpath路径定位
  • 第七章 | Solidity 合约继承与接口全面讲解
  • Git冲突解决
  • MySQL的InnoDB 与 MyISAM 在性能方面不同,适应不同系统的说明
  • 基于C语言实现的观察者模式 以温度监控系统为例
  • python实战,提取数据汇聚到表格中
  • 数据结构--顺序表(实现增删改查)
  • 【C++初阶】---类和对象(上)
  • Vue.js 应用的入口文件main.js
  • BetterDiscord macOS
  • win7忘记密码_通过MS17-010打进去_创建管理员账户
  • 做一个有天有地的css及html画的旋转阴阳鱼
  • Next.js中not-found.js触发方式详解
  • Unity Render Streaming项目之Multiplay经验
  • 【构建CV图像识别系统】从传统方法到深度学习
  • LangChain组件Tools/Toolkits详解(5)——返回产出artifact
  • 蓝桥杯真题 2109.统计子矩阵
  • 蓝桥杯备考-》单词接龙
  • bug:uni-file-picker上传图片报错,文件选择器对话框只能在由用户激活时显示,跨域cors
  • 用PostgreSQL玩转俄罗斯方块:当SQL成为游戏引擎
  • SpringBoot中安全的设置阿里云日志SLS的accessKey