0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手把手教你排序算法怎么写

信盈达 2024-06-04 08:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

efd2e72e-2205-11ef-bd4a-92fbcf53809c.jpg

今天以直接插入排序算法,给大家分享一下排序算法的实现思路,主要包含以下部分内容:

插入排序介绍

插入排序算法实现

手把手教你排序算法怎么写

efe5b3e0-2205-11ef-bd4a-92fbcf53809c.png

在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。


以{3,0,9,8,2}无序表按升序排列为例,有序表是一个虚拟的顺序表:
1. 插入排序刚开始,有序表中没有数据,因此直接插入3即可。{3}

eff3c688-2205-11ef-bd4a-92fbcf53809c.png

2. 插入0的时候要和有序表中记录3进行比较,0 <3,插入到3的左侧。{0,3}

eff76ab8-2205-11ef-bd4a-92fbcf53809c.png

3. 插入9的时候,要和有序表中的记录3进行比较,9 > 3 插入到3的右侧{0,3,9}

effd1e72-2205-11ef-bd4a-92fbcf53809c.png

4. 插入8的时候,要和有序表中的9进行比较,9 > 8 8>3因此添加到 9和3之间{0,3,8,9}

f008e4be-2205-11ef-bd4a-92fbcf53809c.png

5. 插入2的时候,要和有序表中的 9 8 3 0依次比较,确定2位于0和3之间{0,2,3,8,9}

f0112da4-2205-11ef-bd4a-92fbcf53809c.png

分析:1、先写框架2、实现排序逻辑3、验证调整代码



f015267a-2205-11ef-bd4a-92fbcf53809c.png

2.1先写框架-我的预期

这是一段整理思路的过程。

int a[] = {3,0,9,8,2};int size = sizeof(a) / sizeof(int);int i;for(i=0;i{ printf("%d ",a[i]);}printf("\n"); // 传递整型数据和长度进去,对数据进行排序insertSort(a,size);
for(i=0;i{ printf("%d ",a[i]);}

预期效果:// 3 0 9 8 2// 0 2 3 8 9

2.2函数声明

函数三要素:insertSort函数功能:实现对传入数组的排序形参:数组,数组长度返回值:直接在原有数组中进行排序即可,无需返回值。
先写函数声明

void insertSort(int a[],int size){ // ......}


2.3实现排序逻辑1、寻找突破口按照直接插入排序的规则,需要对下标为1以后的每一个数据进行插入排序,先获取到下标为1之后的每一个数据。

void insertSort(int a[],int size){ int i; int j; for(i=1;i { // a[i] 从下标为1开始,每循环一次向后获取到一个数据。
} }

2、寻找排序规律// 使用当前a[i]值和i下标前面的每一个数值进行比较// 如果 a[i-1] > a[i] a[i] = a[i-1] -- a[i]这个数据空间值可能被覆盖掉,// 下面可能还要多次使用到该数据,// 因此可以将这个数据保存下来。// 继续如果 a[i-2] > a[i] a[i-1] = a[i-2]//.....// 如果 a[i-j] < a[i] a[i-j+1] = a[i] --结束本次比较 ,a[i]已经找到它所在的位置了
// 考虑边界// i-j最小值为0,下标不能越界3、伪代码描述先将a[i]的值存起来到变量val里面开始循环比较 j,1<=j<=i(满足i-j最小值为0),每次增加1,保证下标连续比较a[i-j]和val的值
如果a[i-j] > val,a[i-j]需要向后移动,即a[i-j-1] = a[i-j] 如果a[i-j] <= val;val可以直接放在a[i-j+1]的位置,即a[i-j-1] = val;结束本次循环,进入下一个数的插入排序。
4、代码实现

void insertSort(int a[],int size){ int i; int j; for(i=1;i { int val = a[i]; for(j=1;j<=i;j++) { if(a[i-j] <= val) { // 找到val坐在的位置了 a[i-j+1] = val; break; } else { a[i-j+1] = a[i-j]; } 
} } }

5、验证代码

f01900a6-2205-11ef-bd4a-92fbcf53809c.png

出错:没有达到预期,即逻辑存在缺陷


6、排查错误

排查错误的时候,可以将比较的次数和每次比较后数组中的结果打印出来,进行排查。

因为数组打印要遍历,为了不影响其他循环变量的值,可以在声明一个变量。

f01cb69c-2205-11ef-bd4a-92fbcf53809c.png

f03090d6-2205-11ef-bd4a-92fbcf53809c.png

从结果上看,第一次的0没有插入成功,按照逻辑走一遍,发现i=1,j=1,0<3因此3向后移动一步,然后j=2,循环结束了。
也就是意味着,如果当前这个数是数组中的最小的数,应该放在下标为0的这一步操作没有做。
7、修正代码

void insertSort(int a[],int size){ int i; int j; for(i=1;i { int val = a[i]; for(j=1;j<=i;j++) { if(a[i-j] <= val) { // 找到val坐在的位置了 a[i-j+1] = val; break; } else { a[i-j+1] = a[i-j];
// 如果当前a[i]是这个数组中最小的元素, // 交换位置后,只剩下0下标的位置了,需要将数据插入到0的位置上。 if(i-j == 0){ a[i-j] = val; } }
}
} }


运行代码:

f0343a74-2205-11ef-bd4a-92fbcf53809c.png

本篇内容旨在帮助初学者整理写算法代码思路。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4977

    浏览量

    74419
  • 排序算法
    +关注

    关注

    0

    文章

    53

    浏览量

    10471
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    射频头坏了只能扔?手把手教你维修排查TNC插头,干货值得收藏!

    射频接头坏了只能剪掉重做?未必!本文由电蜂优选(elecbee)专家亲授,深度拆解 TNC 插头的维修排查全流程。从中心针偏移纠偏、氧化层化学清理到组装式接头的无损重组,手把手教你如何通过 VNA
    的头像 发表于 04-14 17:12 161次阅读
    射频头坏了只能扔?<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>维修排查TNC插头,干货值得收藏!

    手把手教你学51单片机-C语言版

    ,没有专业的人员带领大家入门。 基于这些原因,我们编写了这本《手把手教你学51单片机-C语言版》(第3版),并且配套了相关的视频教程、电子教案、源代码和实验开发板(详情浏览青岛金思特电子有限公司网站获取
    发表于 03-05 11:47

    从0到1,10+年资深LabVIEW专家,手把手教你攻克机器视觉+深度学习(5000分钟实战课)

    “告别检测系统能力缺陷!10+年LabVIEW视觉资深专家手把手教你:5000+分钟高清教程(含工具、算法原理、实战操作、项目优化全流程讲解)”——从传统视觉算法→深度学习建模→工业级
    的头像 发表于 12-02 08:07 787次阅读
    从0到1,10+年资深LabVIEW专家,<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>攻克机器视觉+深度学习(5000分钟实战课)

    迅为Hi3403开发板极速启航 | 手把手带你玩转核心例程,轻松上手AI视觉!

    迅为Hi3403开发板极速启航 | 手把手带你玩转核心例程,轻松上手AI视觉!
    的头像 发表于 11-19 13:56 1888次阅读
    迅为Hi3403开发板极速启航 | <b class='flag-5'>手把手</b>带你玩转核心例程,轻松上手AI视觉!

    【迅为RK3568开发板NPU实战】别再闲置你的NPU!手把手教你玩转RKNN-Toolkit2 的使用

    【迅为RK3568开发板NPU实战】别再闲置你的NPU!手把手教你玩转RKNN-Toolkit2 的使用
    的头像 发表于 11-11 14:21 1571次阅读
    【迅为RK3568开发板NPU实战】别再闲置你的NPU!<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>玩转RKNN-Toolkit2 的使用

    【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果

    【RK3568 NPU实战】别再闲置你的NPU!手把手带你用迅为资料跑通Android AI检测Demo,附完整流程与效果
    的头像 发表于 11-10 15:58 1269次阅读
    【RK3568 NPU实战】别再闲置你的NPU!<b class='flag-5'>手把手</b>带你用迅为资料跑通Android AI检测Demo,附完整流程与效果

    手把手教你AT指令APN设置:专网连接零门槛!

    无论你的技术背景如何,本教程都将以手把手的方式,拆解AT指令APN设置的全流程。专网连接不再是门槛,即刻开启自主配置之旅! APN是设备连接到运营商网络的“身份证” ——当设备插入SIM卡并注册到
    的头像 发表于 09-04 14:40 1421次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>AT指令APN设置:专网连接零门槛!

    RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱动适配 | 技术集结

    VGLite是NXP提供的轻量级2D图形API,本文将手把手带你实现VGLite图形驱动适配RT-Thread。文章分为上、下两篇,将手把手教您移植。上篇对RT-ThreadNano内核与Finsh组件进行移植,下篇则教您改写SDK中的VGLite代码以将其适配到RT-T
    的头像 发表于 07-17 14:40 3659次阅读
    RT-Thread Nano硬核移植指南:<b class='flag-5'>手把手</b>实现VGLite图形驱动适配 | 技术集结

    【教程】零基础!手把手教你使用STM32F4进行E22-400T22S编程通信

    零基础搭建本次实验将会使用到的软件是Keil和STM32CubeMX,没有这两个软件没有请在网上自行下载。本章节零基础手把手教会你搭建最快捷、最简单的STM32代码
    的头像 发表于 07-03 19:32 1868次阅读
    【教程】零基础!<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>使用STM32F4进行E22-400T22S编程通信

    【精选直播】手把手教你做PC第十二课:WIFI 驱动框架适配

    手把手教你做PC》系列直播课再度开播!《KaihongOS笔记本电脑开发实战第十二课:WIFI驱动框架适配》将于07月02日19:00开播↑扫码入群,领课程讲义资料包↑深开鸿资深工程师亲临直播间
    的头像 发表于 07-01 08:08 739次阅读
    【精选直播】<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做PC第十二课:WIFI 驱动框架适配

    【精选直播】手把手教你做星闪无人机第十课:KaihongOS Lite系统专题

    手把手教你做星闪无人机》系列直播课再度开播!《KaihongOS星闪无人机开发实战⑩:KaihongOSLite系统专题》↑扫码入群,领课程讲义资料包↑深开鸿资深工程师亲临直播间依托笔电实战产品
    的头像 发表于 06-10 08:06 656次阅读
    【精选直播】<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做星闪无人机第十课:KaihongOS Lite系统专题

    手把手教你如何调优Linux网络参数

    在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃。本文基于真实案例分析,从参数解读、问题诊断到优化实践,手把手教你如何调优Linux网络参数,支撑百万级并发连接。
    的头像 发表于 05-29 09:21 1218次阅读

    【精选直播】手把手教你做星闪无人机第九课:无线通信编程之 SLE 专题

    手把手教你做星闪无人机》系列直播课再度开播!《KaihongOS星闪无人机开发实战⑨:无线通信编程之SLE专题》↑扫码入群,领课程讲义资料包↑深开鸿资深工程师亲临直播间依托笔电实战产品案例细致剖析
    的头像 发表于 05-27 08:05 604次阅读
    【精选直播】<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做星闪无人机第九课:无线通信编程之 SLE 专题

    明晚七点!手把手教你做PC第九课:全功能TypeC驱动框架适配

    手把手教你做PC》系列直播课再度开播!《KaihongOS笔记本电脑开发实战第九课:全功能TypeC驱动框架适配》将于5月21日19:00开播↑扫码入群,领课程讲义资料包↑深开鸿资深工程师亲临直播
    的头像 发表于 05-20 08:07 732次阅读
    明晚七点!<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>做PC第九课:全功能TypeC驱动框架适配

    正点原子Linux系列全新视频教程来啦!手把手教你MP257开发板,让您轻松入门!

    正点原子Linux系列全新视频教程来啦!手把手教你MP257开发板,让您轻松入门! 一、视频观看 正点原子手把手教你学STM32MP257-第1期:https://www.bilib
    发表于 05-16 10:42