标题: 插入排序算法 [打印本页]

作者: taotie    时间: 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





作者: skilldog    时间: 2025-8-5 17:16
好怀念的排序,以前跟同学设计了一个SLG游戏,就用到这个排序法记录移动路径。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1