C语言 冒泡排序算法

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

冒泡排序对n个项目需要O(n2)的比较次数,且可以原地排序。尽管这个算法是最简单了解和实作的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

冒泡排序是与插入排序拥有相等的执行时间,但是两种法在需要的交换次数却很大地不同。在最坏的情况,冒泡排序需要O(n2)次交换,而插入排序只要最多O(n)交换。冒泡排序的实现(类似下面)通常会对已经排序好的数列拙劣地执行(O(n2)),而插入排序在这个例子只需要O(n)个运算。因此很多现代的算法教科书避免使用冒泡排序,而用插入排序取代之。冒泡排序如果能在内部循环第一次执行时,使用一个旗标来表示有无需要交换的可能,也有可能把最好的复杂度降低到O(n)。在这个情况,在已经排序好的数列就无交换的需要。若在每次走访数列时,把走访顺序和比较大小反过来,也可以稍微地改进效率。有时候称为往返排序,因为算法会从数列的一端到另一端之间穿梭往返。

使用冒泡排序为一列数字进行排序的过程

冒泡排序算法的运作如下:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

由于它的简洁,冒泡排序通常被用来对于程式设计入门的学生介绍算法的概念。

关于冒泡排序的算法实现网上很多,本文采用C语言泛型实现:

#include

#include

void swap(void *vp1, void *vp2, int size){

char buffer[size];

memcpy(buffer, vp1, size);

memcpy(vp1, vp2, size);

memcpy(vp2, buffer, size);

}

int cmp_int(const void *a , const void *b )

{

return *(int *)a - *(int *)b;

}

int cmp_double(const void *a , const void *b )

{

return *(double *)a > *(double *)b ? 1 : -1;

}

void bubbleSort(void *base, int n, int elemsize, int(*cmp)(const void *, const void *))

{

char *q = (char *)base;

char *p = (char *)base + n * elemsize;

while(p > q) {

for(; q != p - elemsize; q += elemsize) {

if(cmp(q, q + elemsize) > 0) {

swap(q, q + elemsize, elemsize);

}

}

q = (char *)base;

p -= elemsize;

}

}

int main(void)

{

//测试数据

int arr1[] = {5, 4, 1, 3, 6, 12, 8, 22, 34,76};

//冒泡排序

bubbleSort(arr1, 10, sizeof(int), cmp_int);

//打印排序结果

int i;

for(i = 0; i < 10; i++)

printf("%d ", arr1[i]);

printf("\n");

double arr2[] = {5.4, 4.8, 1.2, 3.4, 6.7, 12.12, 8.6, 22.12, 34.5, 76.3};

bubbleSort(arr2, 10, sizeof(double), cmp_double);

for(i = 0; i < 10; i++)

printf("%.2f ", arr2[i]);

printf("\n");

}

运行结果如下:

常规实现如下(C语言):

#include

void bubbleSort(int arr[], int count)

{

int i = count, j;

int temp;

while(i > 0) {

for(j = 0; j < i - 1; j++) {

if(arr[j] > arr[j + 1]){

temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

i--;

}

}

int main()

{

//测试数据

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

//冒泡排序

bubbleSort(arr, 5);

//打印排序结果

for(int i = 0; i < 5; i++)

printf("%4d", arr[i]);

}

使用标志的冒泡排序

如果已知数列基本有序,可采用一个标志,减少无谓的判断,提高效率

void bubbleSort(int d[], int size) //假定两两交换发生在数组最后的两个位置

{

int exchange = size - 1;

while(exchange) {

//记录下发生数据交换的位置

int bound = exchange;

exchange = 0; //假定本趟比较没有数据交换

for(int i = 0; i < bound; i++) {

if(d[i] > d[i + 1]) {

swap(&d[i], &d[i+1]);

exchange = i;

}

}

}

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

c语言冒泡排序获取最小值,C语言 冒泡排序算法详解及实例相关推荐

  1. 随机迷宫 c语言思路,[原创]递归随机迷宫生成算法详解

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include char cw[][4]={" ","┃","━& ...

  2. c语言 unique函数,C++ unique(STL unique)算法详解

    unique() 算法可以在序列中原地移除重复的元素,这就要求被处理的序列必须是正向迭代器所指定的.在移除重复元素后,它会返回一个正向迭代器作为新序列的结束迭代器.可以提供一个函数对象作为可选的第三个 ...

  3. java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]

    本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...

  4. time库是python中处理时间的标准库_python语言time库和datetime库基本使用详解

    今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作,这篇博客花了2个半小时的时间,结合自己所学,所思,所想写作 ...

  5. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

  6. R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等

    R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录

  7. R语言中如何计算C-Statistics?几种计算方法详解

    R语言中如何计算C-Statistics?几种计算方法详解 目录 R语言中如何计算C-Statistics? #包导入 #数据加载编码

  8. js排序算法详解-冒泡排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-冒泡排序 1.1 原始人冒泡排序 function bubbleSort(arr) {var len = ar ...

  9. C语言实现扫雷完整算法详解~(附完整代码~)

    扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...

  10. C语言中的字符串转数字函数常见问题详解

    目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...

最新文章

  1. linux xfs文件误删除恢复_linux系统文件误删除恢复
  2. intellij运行多个工程
  3. 不是有效的win32应用程序_杀毒软件有坑!三分之二的安卓杀毒软件的“主业”并不是杀毒...
  4. java 跳转虚拟目录_java tomcat虚拟目录的深入了解
  5. mysql router docker_MySQL Router 完全讲解
  6. 深入浅出Java核心技术开篇(总结)
  7. NLP的12种后BERT预训练方法
  8. C语言推荐书籍从入门到进阶带你走上大牛之路
  9. java.net.UnknownHostException 异常处理
  10. 电脑主机没有网卡,使用外置无线网卡实现无线投屏/多屏协同
  11. 质量管理三个概念:QC、QA和QM 解析
  12. 工业界和学术界最大区别是什么?
  13. 从原理到应用,一文带你了解微信小程序插件能力
  14. [CTF] 攻防世界MISC高手区部分题目WriteUp(2)
  15. 2021年茶艺师(中级)考试题及茶艺师(中级)考试资料
  16. 激活函数(Relu,sigmoid,Tanh,softmax)详解
  17. 【MM系列】SAP SAP的账期分析和操作
  18. 三星N900刷机包 港版4.4.2精简 官方原汁原味 卡刷包
  19. (转)Android图形系统分析与移植--六、framebuffer研究
  20. 频繁的去跳槽真的有这么可怕吗?

热门文章

  1. JDK与Eclipse版本
  2. windows下编译librtmp库
  3. 可以识别linux的GHOST,Linux可以用ghost
  4. 用ffmpeg转多音轨的mkv文件
  5. i310100和i59400f哪个好 i3 10100和i5 9400f差距大吗
  6. Python3.7安装numpy与scipy库(win10)
  7. ASP.NET MVC diyUpload上传文件!
  8. 低介电常数微波介质陶瓷基覆铜板的研究
  9. Python模拟黑客帝国影片中的终端动画脚本
  10. c语言实现61850协议,IEC61850开发库 libIEC61850提供了用C语言编写的IEC 61850 / MMS - 下载 - 搜珍网...