【C语言】冒泡排序详解

news/2024/7/5 6:09:04

文章目录

  • 前言
  • 一、冒泡排序定义以及原理?
  • 二、具体代码实现
  • 总结


前言

冒泡排序:是对一连串数字进行升序排序或者降序排序的一种排序算法,排序算法有很多种,今天我们先来介绍其中的----冒泡排序


一、冒泡排序定义以及原理?

核心思想:两两相邻元素进行比较

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

冒泡排序算法的原理如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

换句话说,n个元素进行冒泡排序,要进行n-1趟。
其中一趟冒泡排序,两两元素进行比较,这里以升序位列,一行冒泡排序就可以将最大数字排到最后,以此进行,在代码中表示为 sz-1-i (sz:元素个数,i:循环变量)
一趟冒泡排序可以搞定一个数字,让他来到最终应该出现的位置上。

二、具体代码实现

补充说明在代码中以注释展示 (升序排序)

void Sort(int* arr, int sz)
{int i = 0;for (i = 0; i < sz - 1; i++) // sz个元素,进行sz-1趟冒泡排序{int j = 0;int flag = 1; // 优化代码,效率提高for (j = 0; j < sz - 1 - i; j++) //一趟冒泡排序中,两两进行比较,以此递减i{if (arr[j]>arr[j + 1]){int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp; // 排序过程flag = 0; // 排序啦flag制成 0 (做标记)}}if (flag == 1) //(当flag值没变,说明没有元素需要排序,排序完成,跳出循环){break;}}
}
void print(int* p, int sz) //arr传的是数组首元素的地址
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", *p); //对地址解引用,输出元素p++; //找下一个元素}
}
int main()
{int arr[10] = { 9, 8, 7, 4, 5, 6, 3, 2, 1,10 };int sz = sizeof(arr) / sizeof(arr[0]); //元素个数Sort(arr,sz);// 排序函数print(arr,sz);// 打印函数return 0;
}

请添加图片描述

这里我们就1-10这10个数字进行升序排序。 同理,如果需要进行降序排序,只需要将排序代码中的 if (arr[j]>arr[j + 1]) 大于符号换成小于符号即可。(if (arr[j]<arr[j + 1]))


总结

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

以上就是要给大家介绍的排序算法中的冒泡排序,如果觉得文章对你有帮助,欢迎大家点赞收藏~


http://lihuaxi.xjx100.cn/news/284301.html

相关文章

用Python让蔡徐坤在我的命令行里打篮球!|附完整代码

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑来源 | 01二进制&#xff08;ID:gh_d1999add1857&#xff09;编辑 | Jane【导语】作者自称是一个经常逛 B 站的肥宅。最近 B 站上流行的视频素材除了“换脸”&#xff0c;其次就要属…

MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)

前言&#xff1a; 刚刚学完了MVC&#xff0c;根据自己的感悟和理解写了一个小项目。 完全按照MVC模式&#xff0c;后面有一个MVC的理解示意图。 用MVC模式重新完成了联系人的管理系统&#xff1a; 用户需求&#xff1a; 多用户系统&#xff0c;提供用户注册、登录功能&#xf…

介绍java -cp java -jar的区别

java -cp 和 -classpath 一样&#xff0c;是指定类运行所依赖其他类的路径&#xff0c;通常是类库&#xff0c;jar包之类&#xff0c;需要全路径到jar包&#xff0c;window上分号“;” java -cp & java jar格式 java -cp和-classpath一样&#xff0c;是指定类运行所依赖其…

关于Linux下编译C文件出现storge size of ‘act‘ isn‘t know和never include <bits/sigaction.h> directory:usr<signal

1.出现以下问题&#xff1a;这个是在使用struct sigaction act;中出现了问题 提示&#xff1a;可以看到提示我们说“不知道这个act的存储大小” &#xff0c;那就说明找不到&#xff0c;很有可能是缺少什么头文件&#xff1a; 网上提示我们加入头文件&#xff1a;#include<b…

【C语言刷题】交换两个变量(包含不创建临时变量)的解法

目录一.常规方法&#xff08;引入空瓶变量&#xff09;二.题目要求&#xff0c;不允许创建临时变量2.1 通过两数加法实现交换2.2 按位异或操作符实现交换题目&#xff1a;写代码实现两个变量的交换。&#xff08;不允许创建临时变量&#xff09;一.常规方法&#xff08;引入空瓶…

抵制996!Python之父发声背后,这个社区一呼百应!

「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑这一次&#xff0c;程序员们也终于见证了一次 Python 社区的强大能量&#xff01;3 月底&#xff0c;996.ICU 话题诞生后&#xff0c;目前已在 GitHub Trending 上总计获得了近 23 万个 Star&#xff0c;一度冲…

图像去噪的深度学习最新综述论文,36页pdf,Deep Learning on Image Denoising

图像去噪是学术工业关注的问题。最近广东深圳哈工大分院的研究人员撰写了最新图像去噪深度学习的综述论文&#xff0c;非常值得学习&#xff01;关注文章公众号对话框回复“paper29”获取本篇论文地址&#xff1a;https://arxiv.org/abs/1912.13171简介&#xff1a;深度学习技术…

关于组培的一些想法(求知解惑),多肉科普

本文抛砖引玉&#xff0c;根据自己这段时间的看帖学习&#xff0c;提出自己的一些想法&#xff0c;希望各位看官特别是专家的指正 何为组培 所谓组培就是无性繁殖&#xff0c;商家组培的是一种&#xff0c;叶插是其实也是一种&#xff0c;有人说是介于种子繁殖和克隆之间的一种…