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

【算法】(C语言):冒泡排序、选择排序、插入排序

冒泡排序

  1. 从第一个数据开始到第n-1个数据,依次和后面一个数据两两比较,数值小的在前。最终,最后一个数据(第n个数据)为最大值。
  2. 从第一个数据开始到第n-2个数据,依次和后面一个数据两两比较,数值小的在前。最终,倒数第二个数据(第n-1个数据)为第二个最大值。
  3. 从第一个数据开始到第n-3个数据,依次和后面一个数据两两比较,数值小的在前。最终,倒数第三个数据(第n-2个数据)为第三个最大值。
  4. 最多重复操作n-1次。

时间复杂度:最好情况 O(n),最坏情况 O(n^{2}),平均情况 O(n^{2})

  • 若已是排好的,从开头到最后,两两比对,需要n-1次比对,无需交换,一轮结束,则时间约n,即 O(n)。
  • 若是乱序,则需最多n-1次重复操作,虽然每次重复操作的比对次数减1,但总时间约n^{2},即O(n^{2})。

空间复杂度:O(1)

  • 在原位置排序,只重复使用了用于交换的临时空间,不随数据量的变动而变动,空间使用为常量(1)。


C语言实现:(bubblesort.c)

#include <stdio.h>/* function prototype */
void bubble(int *, int);	// bubble sort
void traverse(int *, int);	// show element one by one/* main function */
int main(void)
{int arr[] = {4,2,6,9,5,1,3};int n = sizeof(arr) / sizeof(int);traverse(arr, n);bubble(arr, n);	printf("[ after bubble sort ] ");traverse(arr, n);return 0;
}/* subfunction */
void bubble(int *array, int length)		// bubble sort
{for(int i = length - 1; i > 0; i--){int ischange = 0;for(int j = 0; j < i; j++){if(array[j] > array[j+1]){int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;ischange = 1;}}if(ischange == 0) return ;}
}void traverse(int *array, int length)		// show element one by one
{printf("elements(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

编译链接: gcc -o bubblesort bubblesort.c

执行可执行文件: ./bubblesort



选择排序

  1. 从第一个数据开始到最后,挑选最小值,放入第一个位置。
  2. 从第二个数据开始到最后,挑选最小值,放入第二个位置。
  3. 从第三个数据开始到最后,挑选最小值,放入第三个位置。
  4. 共重复操作n-1次。

时间复杂度:最好情况 O(n^{2}),最坏情况 O(n^{2}),平均情况 O(n^{2})

  • 从开头到最后,挑选最小值,需要n-1次比对。重复n-1次操作,虽然每次重复操作的比对次数减1,但总时间约n^{2},即O(n^{2})。

空间复杂度:O(1)

  • 在原位置排序,只重复使用了用于交换的临时空间,不随数据量的变动而变动,空间使用为常量(1)。


C语言实现:(selectsort.c)

#include <stdio.h>/* function prototype */
void select(int *, int); 	// select sort
void traverse(int *, int);	// show element one by one/* main function */
int main(void)
{int arr[] = {4,2,6,9,5,1,3};int n = sizeof(arr) / sizeof(int);traverse(arr, n);select(arr, n);printf("[ after select sort ] ");traverse(arr, n);return 0;
}/* subfunction */
int findmin(int *array, int m, int n)		// find the minimum data, return index
{int minindex = m, mindata = array[m];int j;for(j = m + 1; j < n; j++){if(mindata > array[j]){minindex = j;mindata = array[j];}}return minindex;
}void select(int *array, int length)	 	// select sort
{for(int i = 0; i < length - 1; i++){int min = findmin(array, i, length);if(i != min){int tmp = array[i];array[i] = array[min];array[min] = tmp;}}
}void traverse(int *array, int length)		// show element one by one
{printf("elements(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

编译链接: gcc -o selectsort selectsort.c

执行可执行文件: ./selectsort



插入排序

  1. 第二个数据和第一个数据,两两比较,数值小的在前。
  2. 从第三个数据开始到第一个数据,依次和前面一个数据两两比较,数值小的在前。
  3. 从第四个数据开始到第一个数据,依次和前面一个数据两两比较,数值小的在前。
  4. 最多重复操作n-1次。

时间复杂度:最好情况 O(n),最坏情况 O(n^{2}),平均情况 O(n^{2})

  • 若已是排好的,无需交换,从第二个数据到最后,依次只需和前面一个数据两两比对,需要n-1次比对,则时间约n,即 O(n)。
  • 若是乱序,则除了和前面数据两两比对(需n-1次比对),还需重复往前比对,最多比对n-1次,总时间约n^{2},即O(n^{2})。

空间复杂度:O(1)

  • 在原位置排序,只重复使用了用于交换的临时空间,不随数据量的变动而变动,空间使用为常量(1)。


C语言实现:(insertsort.c)

#include <stdio.h>/* function prototype */
void insertsort(int *, int);		// insert sort
void traverse(int *, int);		// show element one by one/* main function */
int main(void)
{int arr[] = {4,2,6,9,5,1,3};int n = sizeof(arr) / sizeof(int);traverse(arr, n);insertsort(arr, n);printf("[ after insert sort ] ");traverse(arr, n);return 0;
}/* subfunction */
void insertsort(int *array, int length)	// insert sort
{int ischange = 0;for(int i = 1; i < length; i++){for(int j = i; j >= 0; j--){if(array[j-1] > array[j]){int tmp = array[j];array[j] = array[j-1];array[j-1] = tmp;ischange = 1;}if(ischange == 0) return ;}}
}void traverse(int *array, int length)		// show element one by one
{printf("element(%d): ", length);for(int k = 0; k < length; k++){printf("%d  ", array[k]);}printf("\n");
}

编译链接: gcc -o insertsort insertsort.c

执行可执行文件: ./insertsort

相关文章:

【算法】(C语言):冒泡排序、选择排序、插入排序

冒泡排序 从第一个数据开始到第n-1个数据&#xff0c;依次和后面一个数据两两比较&#xff0c;数值小的在前。最终&#xff0c;最后一个数据&#xff08;第n个数据&#xff09;为最大值。从第一个数据开始到第n-2个数据&#xff0c;依次和后面一个数据两两比较&#xff0c;数值…...

iOS项目怎样进行二进制重排

什么是二进制重排 &#xff1f; 在iOS项目中&#xff0c;二进制重排&#xff08;Binary Reordering 或者 Binary Rearrangement&#xff09;是一种优化技术&#xff0c;主要目的是通过重新组织应用程序的二进制文件中的代码和数据段&#xff0c;来提高应用程序的性能&#xff…...

CentOS中使用SSH远程登录

CentOS中使用SSH远程登录 准备工作SSH概述SSH服务的安装与启动建立SSH连接SSH配置文件修改SSH默认端口SSH文件传输 准备工作 两台安装CentOS系统的虚拟机 客户机&#xff08;192.168.239.128&#xff09; 服务器&#xff08;192.168.239.129&#xff09; SSH概述 Secure S…...

spring @Autowire注解作用

终于有人把Autowired注解讲清楚了&#xff0c;赞&#xff01;&#xff01;&#xff01;_autowired-CSDN博客...

密码学原理精解【5】

这里写目录标题 移位密码概述代码 希尔密码( Z 256 Z_{256} Z256​)待加密长度被3整除待加密长度不一定被3整除加解密文件 移位密码 概述 以 z 26 运算为例 , k 为密钥 加密&#xff1a; e k ( x ) ( x k ) m o d 26 解密&#xff1a; d k ( x ) ( x − k ) m o d 26 以z_{…...

Unity3D 资源管理YooAsset原理分析与详解

引言 Unity3D 是一款广泛应用于游戏开发、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域的强大游戏开发引擎。在开发过程中&#xff0c;资源管理是一项至关重要的任务&#xff0c;它直接影响到游戏的性能和用户体验。YooAsset 是一个基于 Un…...

npm install puppeteer 报错 npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated解决办法

npm install puppeteer 报错如下&#xff1a; npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated. Use PUPPETEER_DOWNLOAD_BASE_URL instead. npm ERR! Error: ERROR: Failed to set up Chrome v126.0.6478.126! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to sk…...

浙大版PTA《Python 程序设计》题目集 参考答案

浙大版PTA《Python 程序设计》题目集 参考答案 本答案配套详解教程专栏&#xff0c;欢迎订阅&#xff1a; PTA浙大版《Python 程序设计》题目集 详解教程_少侠PSY的博客-CSDN博客 01第1章-1 从键盘输入两个数&#xff0c;求它们的和并输出 aint(input()) # 输入a的值 bint(…...

“拆分盘投资:机遇与风险并存

一、引言 随着互联网技术的日新月异&#xff0c;金融投资领域迎来了前所未有的变革&#xff0c;其中拆分盘作为一种新兴的投资模式&#xff0c;正逐渐进入公众的视野。其独特的价值增长逻辑和创新的投资机制&#xff0c;为投资者开辟了新的财富增值渠道。本文旨在深入探讨拆分…...

Java面试题系列 - 第2天

题目&#xff1a;Java中的线程池模型及其配置策略 背景说明&#xff1a;在Java多线程编程中&#xff0c;线程池是一种高效的线程复用机制&#xff0c;能够有效管理和控制线程的创建与销毁&#xff0c;避免频繁创建和销毁线程带来的性能开销。理解和掌握线程池的配置策略对于优…...

AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!

一、前言 2017年&#xff0c;谷歌团队推出一篇神经网络的论文&#xff0c;首次提出将“自注意力”机制引入深度学习中&#xff0c;这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时&#xff0c;Transformer也随之进入大众视野。一夜之间&…...

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域&#xff0c;随着技术的飞速发展和智能设备的普及&#xff0c;将先进的计算机视觉技术集成到移动平台&#xff0c;特别是Android系统中&#xff0c;已成为提升用户体验、拓展应用功能的关键。其中&#xff0c;目标检测与人脸识别作为计算机视…...

常见网络攻击方式及防御方法

1. DDOS攻击&#xff08;分布式拒绝服务攻击&#xff09; 概念&#xff1a;借助于C/S&#xff08;客户端/服务器&#xff09;技术&#xff0c;将多个计算机联合起来作为攻击平台&#xff0c;对一个或多个目标发动DDOS攻击&#xff0c;从而成倍地提高拒绝服务攻击的威力。防护方…...

使用 ESP32 实现无线对讲机功能涉及音频采集、音频传输以及音频播放等多个方面。实现无线对讲机功能的基本步骤和示例代码。

硬件准备 两个 ESP32 开发板两个 MAX9814 麦克风模块&#xff08;或其他兼容的模拟麦克风模块&#xff09;两个 MAX98357A DAC 模块&#xff08;或其他兼容的音频放大器模块&#xff09;扬声器 接线 麦克风模块 -> ESP32 ADC 引脚ESP32 DAC 引脚 -> 音频放大器模块 -&…...

SpringBoot项目,配置文件pom.xml的结构解析

pom.xml 是 Maven 项目对象模型&#xff08;Project Object Model&#xff09;的配置文件&#xff0c;它定义了 Maven 项目的基本设置和构建过程。以下是 pom.xml 文件的基本结构和一些常见元素的解析&#xff1a; 项目声明 (<project>): <modelVersion>: 通常设置…...

教程:Spring Boot中集成Memcached的详细步骤

教程&#xff1a;Spring Boot中集成Memcached的详细步骤 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代应用开发中&#xff0c;缓存是提升性能和扩展性…...

Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现

Rqtz : 个人主页 ​​ 共享IT之美&#xff0c;共创机器未来 ​ Sharing the Beauty of IT and Creating the Future of Machines Together 目录 项目背景 ​编辑​专有名词介绍 服务器GUI展示 功能(位置见上图序号) 客户端GUI展示&#xff08;h5cssjs&#xf…...

实验一 MATLAB \ Python数字图像处理初步

一、实验目的&#xff1a; 1&#xff0e;熟悉及掌握在MATLAB\Python中能够处理哪些格式图像。 2&#xff0e;熟练掌握在MATLAB\Python中如何读取图像。 3&#xff0e;掌握如何利用MATLAB\Python来获取图像的大小、颜色、高度、宽度等等相关信息。 4&#xff0e;掌握如何在M…...

echarts柱状选中shadow阴影背景宽度设置

使用line&#xff0c;宽度增大到所需要的宽度&#xff0c;设置下颜色透明度就行 tooltip: {trigger: axis,//把阴影的层级往下降z:-15,axisPointer: {type: line,lineStyle: {color: rgba(150,150,150,0.3),width: 44,type: solid,},}, }, series: [{type: bar,barWidth:20,//…...

ArrayBuffer 对象常见的几个用途

ArrayBuffer 在 JavaScript 中的用途广泛&#xff0c;主要用于处理二进制数据。 ArrayBuffer 对象、 TypedArray 视图和 DataView 视图是 JavaScript 操作二进制数据的一个接口。本文介绍ArrayBuffer 对象的常见的一些用法。 1. 网络传输二进制数据 使用方法&#xff1a;通过 …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...