冒泡排序算法及其改进(C语言实现)

2024-08-25 13:08

本文主要是介绍冒泡排序算法及其改进(C语言实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、经典冒泡算法

假设有n个数需要排列成非递减数列。冒泡算法的主要思想是
①比较第一个与第二个数,如果第二个数小于第一个数则交换,否则不交换;然后以同样的规则比较第二第三个数,以此类推,比如
在这里插入图片描述

这样就完成了一趟排序,通过不断地交换,第一趟排序进行了n-1次比较就把最大的数交换到了最后。
②遵循①中的规则进行下一趟排序,由于最后一位已经确定是最大值,则第二次只需要n-2次比较既可以把第二大的数交换到倒数第二个位置。
③以此类推,第i趟排序需要经过n-i次比较
其算法具体实现如下:

#include <stdio.h>void sort(int* N,int n){int i,j,k;// 外循环控制趟数,一共需要n-1趟for(i = n - 1; i > 0; i--){// 内循环控制每一趟比较的次数for(j = 0; j < i; j++){// 相邻两个数进行比较,如果前一个数较大则进行交换if(N[j] > N[j + 1]){k = N[j];N[j] = N[j + 1];N[j + 1] = k;}}}
}
int main(int argc, char **argv)
{int N[6] = {25,14,54,63,44,3};int n = 6;sort(N,n);int i;for(i = 0; i < n; i++){printf("%d",N[i]);if(i != n - 1) printf(",");}return 0;
}

运行结果:
在这里插入图片描述

二、冒泡算法的改进

冒泡算法的算法时间复杂度显然为o(n2),效率十分低下。在有些情况下,算法执行若干次后,可能已经是有序序列了,但是上面的冒泡算法已经执行后面的比较,知道执行完n-1趟排序,这样显然不是最佳的方式。这时候我们可以设置一个标记,用来判断一趟排序过后有没有发生交换,如果没有发生交换,则说明数组已经有序了,已经不需要再进行余下的比较

#include <stdio.h>void sort(int* N,int n){int i,j,k,l;// 外循环控制趟数,一共需要n-1趟for(i = n - 1; i > 0; i--){// l初始化为0,用于记录每一趟排序的交换次数,//如果一趟排序过后交换次数依然是0,则表示数组已经是有序的了l = 0;// 内循环控制每一趟比较的次数for(j = 0; j < i; j++){// 相邻两个数进行比较,如果前一个数较大则进行交换if(N[j] > N[j + 1]){// 如果发生了交换,l自增l++;k = N[j];N[j] = N[j + 1];N[j + 1] = k;}}if(l != 0) printf("第%d趟排序,发生了%d次交换\n",n - i,l);else {printf("第%d趟排序,没有发生交换,数组已经有序\n",n - i);break;}}
}
int main(int argc, char **argv)
{int N[6] = {1,2,3,4,5,6};int n = 6;sort(N,n);int i;for(i = 0; i < n; i++){printf("%d",N[i]);if(i != n - 1) printf(",");}return 0;
}

运行结果:
在这里插入图片描述

这是一个比较极端的情况,需要排序的数组本来就是有序的。可以看出程序只执行了一趟排序,而不是传统冒泡排序的n-1趟排序,效率有所提高。

三、冒泡算法的再改进

在某些情况下,如果进行了若干次排序之后,后面的若干个数已经是有序的,那么下一趟排序就只需要比较前面无序的那一段就可以了。所以我们可以设置一个标记用来记录每趟排序最后一个发生交换的位置,下一趟排序值比较到此位置即可。

#include <stdio.h>void sort(int* N,int n){int i,j,k,flag;// 初始化标记为-1flag = n - 1;while(flag > 0){i = flag;flag = 0;for(j = 0; j < i; j++){if(N[j] > N[j + 1]){k = N[j];N[j] = N[j + 1];N[j + 1] = k;flag = j;}}printf("最后一次发生交换的位置为%d\n",flag);}}
int main(int argc, char **argv)
{int N[6] = {2,1,4,3,5,6};int n = 6;sort(N,n);int i;for(i = 0; i < n; i++){printf("%d",N[i]);if(i != n - 1) printf(",");}return 0;
}

运行结果:
在这里插入图片描述

虽然以上两种算法对传统的冒泡排序做了一定程度的优化,但是算法复杂度还是o(n2),所以最好的优化方法就是——能不用冒泡算法就不用冒泡算法,改用算法复杂度小的。

这篇关于冒泡排序算法及其改进(C语言实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105639

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、