Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3273|回复: 8

[已解决]插入排序算法求助

[复制链接]
发表于 2014-1-10 10:19 | 显示全部楼层 |阅读模式
本帖最后由 mg0601001 于 2014-1-10 19:38 编辑

小弟在学习vba排序中的插入排序,以下是自己写的代码,调试了很多次,觉得与兰版的原理差不多,但是就是结果不对,求指教,多谢!
Sub t1()
Dim arr
Dim x, y, k,  tem
arr = Range("a1:a10")
   For x = 2 To UBound(arr)            
      For y = x - 1 To 1 Step -1      
         If arr(y, 1) > arr(x, 1) Then
            arr(y + 1, 1) = arr(y, 1)                  
         Else
            Exit For                  
         End If
      Next y                        
      tem = arr(x, 1)
      arr(x, 1) = arr(y + 1, 1)
      arr(y + 1, 1) = tem
   Next x
  Range("b1").Resize(UBound(arr)) = arr
End Sub

最佳答案
2014-1-10 16:32

  1. Sub test1()
  2.     arr = Application.Transpose(Range("a1:a10")) '待排序数据转为一维数组以便观察
  3.     For x = 2 To UBound(arr) '从第2行开始检查至末尾
  4.         insert_Tmp = arr(x) '把当前行x对应的数值存入【待插入值】即临时变量insert_Tmp
  5.         For y = x - 1 To 1 Step -1 '倒序检查当前行之前所有行 x-1 to 1
  6.             If arr(y) > insert_Tmp Then '如果当前行y对应的数值arr(y)比【待插入值】还要大
  7.                 arr(y + 1) = arr(y)  '那么需要向下一行y+1挪一下位置,留出空位让【待插入值】可以插入
  8.          'arr(y) = insert_Tmp 'y行中插入【待插入值】……但为了提高效率不要马上插入,这句不执行
  9.             Else
  10.                 Exit For '如果当前行y对应数值已经不必【待插入值】大,那么可以确定本次插入位置为y+1
  11.             End If
  12.         Next y
  13.         arr(y + 1) = insert_Tmp '比较结束,按最后确定的插入位置y+1行中插入【待插入值】
  14.     Next x
  15.     Range("b1").Resize(UBound(arr)) = Application.Transpose(arr) '向工作表中输出排序结果
  16. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-1-10 10:27 | 显示全部楼层
本帖最后由 苗凱 于 2014-1-10 10:31 编辑

误导了,呵呵  
回复

使用道具 举报

发表于 2014-1-10 10:27 | 显示全部楼层
IF里的处理不对,你已经改变了源数据,肯定得不到正确的结果
回复

使用道具 举报

 楼主| 发表于 2014-1-10 10:47 | 显示全部楼层
求楼上详解,多谢!
回复

使用道具 举报

 楼主| 发表于 2014-1-10 10:53 | 显示全部楼层
还不是特别名表,求详解,多谢。
回复

使用道具 举报

发表于 2014-1-10 12:42 | 显示全部楼层
Sub t1()
Dim arr
Dim x, y, k,  tem
arr = Range("a1:a10")
   For x = 2 To UBound(arr)   
tem = arr(x, 1)         
      For y = x - 1 To 1 Step -1      
         If arr(y, 1) >  tem  Then
            arr(y + 1, 1) = arr(y, 1)                  
         Else
            Exit For                  
         End If
      Next y                          
      arr(y + 1, 1) = tem
   Next x
  Range("b1").Resize(UBound(arr)) = arr
End Sub

评分

参与人数 1 +3 收起 理由
mg0601001 + 3 很给力!多谢,明白了,if的第二句改变了后续.

查看全部评分

回复

使用道具 举报

发表于 2014-1-10 12:42 | 显示全部楼层
本帖最后由 苗凱 于 2014-1-10 12:49 编辑

你看看,是不是对的,你的错误是把直接比较了,那样的话改变了它的值,需要找一个过度的变量才行,用过度的变量来保存它的值就没有问题了,不知道楼主明白没.?
回复

使用道具 举报

发表于 2014-1-10 16:31 | 显示全部楼层
Sub test1()
    arr = Application.Transpose(Range("a1:a10")) '待排序数据转为一维数组以便观察
    For x = 2 To UBound(arr) '从第2行开始检查至末尾
        insert_Tmp = arr(x) '把当前行x对应的数值存入【待插入值】即临时变量insert_Tmp
        For y = x - 1 To 1 Step -1 '倒序检查当前行之前所有行 x-1 to 1
            If arr(y) > insert_Tmp Then '如果当前行y对应的数值arr(y)比【待插入值】还要大
                arr(y + 1) = arr(y)  '那么需要向下一行y+1挪一下位置,留出空位让【待插入值】可以插入
         'arr(y) = insert_Tmp 'y行中插入【待插入值】……但为了提高效率不要马上插入,这句不执行
            Else
                Exit For '如果当前行y对应数值已经不必【待插入值】大,那么可以确定本次插入位置为y+1
            End If
        Next y
        arr(y + 1) = insert_Tmp '比较结束,按最后确定的插入位置y+1行中插入【待插入值】
    Next x
    Range("b1").Resize(UBound(arr)) = Application.Transpose(arr) '向工作表中输出排序结果
End Sub
回复

使用道具 举报

发表于 2014-1-10 16:32 | 显示全部楼层    本楼为最佳答案   

  1. Sub test1()
  2.     arr = Application.Transpose(Range("a1:a10")) '待排序数据转为一维数组以便观察
  3.     For x = 2 To UBound(arr) '从第2行开始检查至末尾
  4.         insert_Tmp = arr(x) '把当前行x对应的数值存入【待插入值】即临时变量insert_Tmp
  5.         For y = x - 1 To 1 Step -1 '倒序检查当前行之前所有行 x-1 to 1
  6.             If arr(y) > insert_Tmp Then '如果当前行y对应的数值arr(y)比【待插入值】还要大
  7.                 arr(y + 1) = arr(y)  '那么需要向下一行y+1挪一下位置,留出空位让【待插入值】可以插入
  8.          'arr(y) = insert_Tmp 'y行中插入【待插入值】……但为了提高效率不要马上插入,这句不执行
  9.             Else
  10.                 Exit For '如果当前行y对应数值已经不必【待插入值】大,那么可以确定本次插入位置为y+1
  11.             End If
  12.         Next y
  13.         arr(y + 1) = insert_Tmp '比较结束,按最后确定的插入位置y+1行中插入【待插入值】
  14.     Next x
  15.     Range("b1").Resize(UBound(arr)) = Application.Transpose(arr) '向工作表中输出排序结果
  16. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 12:18 , Processed in 0.344670 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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