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

C语言--排序算法

排序算法有三类:

1.选择排序

2.冒泡排序

3.插入排序

选择排序:

选择排序核心思想:每一轮从待排序的元素中选出最小的一个,放到已排序序列的末尾。

#include<stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 int i,j; 6 int a[]={8,6,2,9,3,5,1,7,4,10}; 7 int len = sizeof(a)/sizeof(a[0]); //获取数组长度 8 for(i=0;i<len-1;i++) //控制要对比的开始位置 开始位置前数组是已排序的 9 { 10 for(j=i+1;j<len;j++) //控制要与开始位置对比的数 11 { 12 if(a[i]>a[j]) //如果开始位置的数更大,则交换位置,使得开始位置的数趋于最小 13 { 14 int t=a[i]; //开始交换 15 a[i]=a[j]; 16 a[j]=t; //结束交换 17 } 18 } 19 } 20 for(i=0;i<len;i++) 21 { 22 printf("a[%d]=%d\n",i,a[i]); //输出数组的所有值 23 } 24 printf("len=%d\n",len); 25 return 0; 26 }

易错点:内层循环需要从i+1开始,若从i开始则a[i]会与a[i]自己比较一次

外循环i需要从0开始,因为数组从a[0]开始

特点

  • 时间复杂度:O(n²)(无论好坏)

  • 空间复杂度:O(1)

  • 交换次数最少
    这里我写的选择排序遇到更小的立刻交换,也可以记录最小的数据下标,遍历之后再交换以减少交换次数

冒泡排序:

1 #include<stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 int a[9]={5,2,6,8,3,9,1,4,7}; 6 int i; 7 int len =sizeof(a)/sizeof(a[0]); //获取数组长度 8 int j; 9 for(j=len;j>1;j--) //控制未排序数组的位置,使得程序不在有序位置进行对比 10 { 11 for(i=0;i<j-1;i++) //在未排序数组中逐个对比 12 { 13 if (a[i]>a[i+1]) 14 { 15 int t = a[i]; 16 a[i]=a[i+1]; 17 a[i+1]=t; 18 //交换 19 } 20 } 21 } 22 for(i=0;i<len;i++) //打印数组 23 { 24 printf("a[%d] = %d\n",i,a[i]); 25 } 26 return 0; 27 } 28 //冒泡排序,核心思想在于让较大的数交换到右边,然后最右侧就有部分是有序的,下一次不需要再检查有序部分,循环进行此步骤让整个数组有序

冒泡排序基本流程:两数对比,排序(顺序不符的情况下交换),i++对比下一对数,一遍走完之后可以确定最大(小)数在最左(右)边,则可以确定那部分数是有序的,下一次不必再对比。

特点

  • 时间复杂度:O(n²)(最坏),O(n)(最好,已有序时)

  • 空间复杂度:O(1)

  • 稳定排序

插入排序:

1 #include<stdio.h> 2 3 int main(int argc, const char *argv[]) 4 { 5 int a[10]={8,6,0,3,5,2,1,9,7,4}; 6 int b[10]; 7 int i; 8 int j=0; 9 for(i=0;i<10;i++) //a[i]是要插入的数 10 { 11 int t = a[i]; 12 j=i; 13 while(j>0 && t<b[j-1]) //j>0条件是为了防止数组越界,当要插入的数更小时,说明要插入的数应该在对比数的前面,对比数后移让出位置,j--继续对比 14 { 15 b[j]=b[j-1]; 16 j--; 17 } 18 b[j]=t; 19 } 20 for(i=0;i<10;i++) //打印数组b 21 printf(" %d\n",b[i]); 22 return 0; 23 } 24 //插入排序核心思想在于寻找我新拿来要插入的数需要放在已有数组的什么位置,找到位置并空出位置后插入就好了

注意,插入排序初始插入第一个数时,只有一个数所以认为其已排序,然后依次取出元素插入合适位置,保持已排序部分始终有序。

特点

  • 时间复杂度:O(n²)(最坏),O(n)(最好,已有序时)

  • 空间复杂度:O(1)

  • 稳定排序

  • 数据量小或基本有序时效率高

http://www.cnnetsun.cn/news/3630045.html

相关文章:

  • AMC1311精密隔离放大器评估板深度解析:从电路设计到PCB布局实战
  • FastAPI分层架构实战:高效API开发指南
  • 灵境1911 短剧工业化系统:AI短剧量产工作流全解析
  • HarmonyOS开发实战:小分享-深浅色主题切换——基于 resources/dark 适配
  • Switch游戏安装终极指南:3分钟学会所有格式兼容方法
  • 3步解锁网易云音乐限制:ncmdump让NCM格式音乐重获播放自由
  • AI 芯片简报 07.21-07.24:NVIDIA Vera 亮剑、AMD 2nm GPU、Google 叛逃 CoWoS
  • 如何快速掌握CTF流量分析:5分钟上手CTF-NetA终极指南
  • 宿舍投影仪测评:哪款宿舍投影仪值得买?2026宿舍投影仪推荐
  • 魔兽争霸3终极助手:WarcraftHelper完整配置与性能优化指南
  • AI论文写作工具:提升学术效率的智能解决方案
  • 单细胞测序AI注释:大语言模型革新生物医学研究
  • 深入解析ADS892xB系列ADC:转换器模块、接口协议与高速数据采集实战
  • 水木清华联手滑铁卢大学:让AI编程助手“看懂“工具返回值
  • 计算机基础·计算机组成原理
  • TLV320ADC3101低功耗音频ADC:集成miniDSP的硬件设计与配置实战
  • AI应用开发四层技术栈:MCP协议与模块化实践
  • Apache Doris 实战教程:手把手实现 ClickHouse 表结构迁移与数据校验
  • Linear Loops功能详解:简化循环工程操作与自动化工作流
  • Claude Code v2.1.216性能优化:解决长会话卡顿与Agent行为异常
  • QKeyMapper:Windows游戏手柄键盘鼠标全能映射的终极解决方案
  • 大模型时代NLP技术演进与实战指南
  • 程序员转型大模型:核心技能与实战路线图
  • Centos7 编译安装Cmake+ffmpeg
  • windows系统下搭建Python开发环境
  • REFramework终极指南:如何为RE引擎游戏安装模组和脚本平台
  • 如何在Mac上实现窗口置顶:Topit完整使用指南与效率提升技巧
  • 告别重复操作:BetterGI如何用AI技术解放你的原神游戏时间
  • this关键字
  • 终极本地图片搜索神器:5分钟掌握千万级图库秒搜技巧