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

    文章

    4741

    浏览量

    68319
  • 排序算法
    +关注

    关注

    0

    文章

    52

    浏览量

    10051
收藏 人收藏

    评论

    相关推荐

    手把手教你如何自制目标检测框架

    今天,给大家分享一篇来自知乎的一篇关于目标检测相关的一些内容, 本文基于Pytorch进行编写。
    的头像 发表于 11-14 16:39 111次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何自制目标检测框架

    STM32的ADC采样及各式滤波算法实现

    本文为手把手教学ADC采样及各式滤波算法的教程,本教程的MCU采用STM32F103ZET6。以HAL库的ADC采样函数为基础进行教学,通过各式常见滤波的实验结果进行分析对比,搭配VOFA+工具直观的展示滤波效果。
    的头像 发表于 10-28 10:51 1035次阅读
    STM32的ADC采样及各式滤波<b class='flag-5'>算法</b>实现

    第14章-蓝牙遥控小车 蓝牙串口通讯讲解蓝牙APP遥控小车 蓝牙串口通讯讲解

    第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解
    的头像 发表于 08-21 16:24 556次阅读
    第14章-蓝牙遥控小车 蓝牙串口通讯讲解蓝牙APP遥控小车 蓝牙串口通讯讲解

    手把手教你通过宏集物联网工控屏&amp;网关进行协议转换,将底层PLC/传感器的数据转换为TCP协议并传输到用户

    手把手教你通过宏集物联网工控屏&网关进行协议转换,将底层PLC/传感器的数据转换为TCP协议并传输到用户终端
    的头像 发表于 08-15 13:29 416次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>通过宏集物联网工控屏&amp;网关进行协议转换,将底层PLC/传感器的数据转换为TCP协议并传输到用户

    手把手教你在orcad中设置CIS元器件数据库,提高工作效率

    元器件数据库,就是实现上述查找元件、放置元件时所需要调用的数据库。本文将手把手教你如何在orcad中配置CIS元器件数据库。
    的头像 发表于 06-15 17:27 5304次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>在orcad中设置CIS元器件数据库,提高工作效率

    手把手带你移植HAL库函数

    开发者更高效地进行嵌入式开发。手把手带你移植HAL库函数HAL库提供了一套抽象接口,使开发者无需直接操作底层硬件寄存器,就能实现对硬件的控制。这种抽象使得代码能够更
    的头像 发表于 05-18 08:04 1658次阅读
    <b class='flag-5'>手把手</b>带你移植HAL库函数

    手把手教你制作高速吹风机

    前言: 高速吹风 机 量价齐升 市场竞争格局初显 吹风机是居家生活必备物品,然而传统型吹风机所带来的体验并不佳,高频使用的女性群体对此更是深有感触。究其原因主要有:转速低,通常在每分钟2万转左右,导致干发速度慢;高温干发,容易损伤头发;噪声大且体积笨重等等。因此,能改善这些问题的高速吹风机一经推出便迅速风靡市场、发展迅猛,品牌数量与产品型号均呈加速增长态势。据统计,2020年仅有6个品牌生产高速吹风机,共16款机型;
    发表于 03-28 09:22 691次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>制作高速吹风机

    FPGA实现双调排序算法的探索与实践

    双调排序(BitonicSort)是数据独立(Data-independent)的排序算法,即比较顺序与数据无关,特别适合并行执行。在了解双调排序
    发表于 03-14 09:50 545次阅读
    FPGA实现双调<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索与实践

    无刷电机无感FOC控制培训系列课程

    | 本工作室推出电机控制无感foc电机控制系列培训课程本课程主要让想进阶的算法工程师,和刚参加工作的工程师或者在校学生能够进一步提高自己的技能,1.从企业用人角度手把手教你做电机控制,提高你的个人
    发表于 03-10 13:52

    【先楫HPM5361EVK开发板试用体验】(原创)5.手把手实战AI机械臂

    HPMicro 【先楫HPM5361EVK开发板试用体验】2手把手实战密钥管理器 KEYM 【先楫HPM5361EVK开发板试用体验】3手把手实战安全数据处理器 SDP 【先楫HPM5361EVK开发板
    发表于 02-06 10:28

    【飞腾派4G版免费试用】4.手把手玩转QT界面设计

    完成了使用Qt Designer进行界面设计的全部流程!是不是觉得像魔法一样神奇呢?赶紧试试吧! 接上三篇: 【飞腾派4G版免费试用】1.实战交叉编译环境搭建和手把手uboot编译 【飞腾派4G版免费
    发表于 01-27 12:49

    工程送样!手把手教你用好广和通RedCap模组FG131&amp;amp;FG132系列

    工程送样!手把手教你用好广和通RedCap模组FG131&FG132系列
    的头像 发表于 01-11 18:22 659次阅读
    工程送样!<b class='flag-5'>手把手</b><b class='flag-5'>教你</b>用好广和通RedCap模组FG131&amp;amp;FG132系列

    手把手教你制作DAPLink

    这篇文章主要描述利用RT-THREAD+CherryUSB制作DapLink调试器(R_DapLink)全流程。这里先感谢网友:sakumisu提供cherryUSB协议栈的技术支持。 什么是下载调试器简单来说,下载调试器是将PC(例如通过USB协议)发送的命令转换为MCU(负责MCU内部外围设备)理解的语言(例如SWD或JTAG协议)的设备,加载代码并精确控制执行。 什么是标准简单来说,标准是一组规则和协议,特定行业中的每个参与者都同意遵循并执行。符合某种内核的单片机Q,都可以使用这种协议来下载程
    的头像 发表于 12-26 08:35 4627次阅读
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>制作DAPLink

    十大排序算法总结

    排序算法是最经典的算法知识。因为其实现代码短,应该广,在面试中经常会问到排序算法及其相关的问题。一般在面试中最常考的是快速
    的头像 发表于 12-20 10:39 1077次阅读

    最新ChatGPT详细注册图文解说教程 ChatGPT账号注册详细步骤分析

    2024年注册ChatGPT详细教程,手把手教你完成ChatGPT的注册
    的头像 发表于 12-04 17:18 8635次阅读
    最新ChatGPT详细注册图文解说教程  ChatGPT账号注册详细步骤分析