找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 101|回复: 1
打印 上一主题 下一主题
收起左侧

插入排序算法

[复制链接]
跳转到指定楼层
楼主
ID:342822 发表于 2025-8-5 14:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
'------------------------------------------------------------------------
' 这个程序演示了插入排序算法
' 我们可以实现从低到高排序
' 也可以实现从高到低排序
' 该算法可以对任何数值型数组进行排序(不支持字符串)
'------------------------------------------------------------------------

$regfile = "m8def.dat"                                 ' 指定使用的微控制器型号文件

$crystal = 8000000                                       ' 使用的晶振频率(16MHz)
$baud = 9600                                             ' 使用的波特率
$hwstack = 32                                             ' 硬件堆栈大小
$swstack = 32                                            ' 软件堆栈大小
$framesize = 32                                          ' 帧大小
Dim Onlongs(17) As Long                                   ' 待排序的数组,根据需要使用Long/Word/Byte类型
Dim X As Byte                                             ' 循环计数器

' 声明子程序
Declare Sub Arraysortasc()                                ' 升序排序
Declare Sub Arraysortdec()                                ' 降序排序

'---用于测试的示例数据---
Onlongs(1) = 270
Onlongs(2) = 120
Onlongs(3) = 99
Onlongs(4) = 1452
Onlongs(5) = 978
Onlongs(6) = 22
Onlongs(7) = 180
Onlongs(8) = 721
Onlongs(9) = 622

Print "排序开始>"                                           ' 打印排序开始提示
Waitms 10                                                 ' 等待10毫秒

Call Arraysortasc                                         ' 调用升序排序子程序
Print "排序升序结果:"                                            ' 打印升序排序完成提示
For X = 1 To 9                                            ' 循环打印排序后的数组
   print Onlongs(x) ; "-";
Next X
print                                                     ' 换行
print
print "升序转为降序"
Call Arraysortdec                                         ' 调用降序排序子程序
Print " 降序排序"                                           ' 打印降序排序完成提示

For X = 1 To 9                                            ' 循环打印排序后的数组
   print Onlongs(x) ; "-";
Next X

End                                                       ' 程序结束

'----------- 使用插入排序算法对Long类型数组进行排序,其他类型变量也可使用 -----------

Sub Arraysortasc()
   Local Al As Long                                       ' 用于存储当前待插入元素的临时变量
   Local I As Byte                                        ' 外层循环计数器
   Local J As Byte                                        ' 内层循环计数器
   Local Z As Byte                                        ' 用于打印数组的计数器

   For I = 2 To 9                                         ' 从第二个元素开始遍历数组
      Al = Onlongs(i)                                     ' 保存当前元素值
      J = I                                               ' 初始化内层循环计数器
      ' 寻找合适的插入位置
      While J > 1 And Onlongs(j -1) > Al                  ' 当前元素比前一个元素小时
         Onlongs(j) = Onlongs(j - 1)                     ' 将前一个元素后移
         J = J - 1                                        ' 继续向前比较

         ' 打印排序过程(调试用)
         For Z = 1 To 9
            print Onlongs(z) ; "-" ;
Waitms 200
         Next
        Waitms 200                                     ' 等待2秒便于观察
         print                                            ' 换行
      Wend
      Onlongs(j) = Al                                     ' 将当前元素插入到正确位置
   Next
End Sub


Sub Arraysortdec()
   ' 降序排序实现,与升序类似只是比较条件相反
   Local Al As Long                                       ' 用于存储当前待插入元素的临时变量
   Local I As Byte                                        ' 外层循环计数器
   Local J As Byte                                        ' 内层循环计数器
   Local Z As Byte                                        ' 用于打印数组的计数器

   For I = 1 To 9                                         ' 从第一个元素开始遍历数组
      Al = Onlongs(i)                                     ' 保存当前元素值
      J = I                                               ' 初始化内层循环计数器
      ' 寻找合适的插入位置
      While J > 1 And Onlongs(j -1) < Al                  ' 当前元素比前一个元素大时
         Onlongs(j) = Onlongs(j - 1)                     ' 将前一个元素后移
         J = J - 1                                       ' 继续向前比较

         ' 打印排序过程(调试用)
         For Z = 1 To 9
            print Onlongs(z) ; "-" ;
         Next
         Wait 2                                         ' 等待2秒便于观察
         print                                            ' 换行
      Wend
      Onlongs(j) = Al                                     ' 将当前元素插入到正确位置
   Next
End Sub




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1157301 发表于 2025-8-5 17:16 | 只看该作者
好怀念的排序,以前跟同学设计了一个SLG游戏,就用到这个排序法记录移动路径。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表