明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2076|回复: 5

发个关于排序的帖子吧

[复制链接]
发表于 2015-2-11 23:06:05 | 显示全部楼层 |阅读模式
本帖最后由 zzyong00 于 2015-2-11 23:15 编辑

     编程,绕不开的算法----排序!处处用到,常用的排序算法也很多,如:插入排序、希尔排序、选择排序、冒泡排序、快速排序等等 ,VBA、VB6开发新手,一般都被这些排序就折腾够呛(如果你从来没用过排序,那么,你编程还没入门)。为啥单说这种开发语言呢?因为,AutoCAD开发,一般有Lisp,C++,vb类语言,而Lisp中有个函数vl-sort,专门用来排序的,所以说用Lisp的人是有福的,平台为你做了很多!而且 C++呢?也有类似的函数,如qsort(algorithm库中),别人为C++开发的库!也能省不少事儿!唯独vb,没有相关的库,平台也没有内置,苦比的程序员只能自己努力了!
    说了半天废话,我的目的是,也开发一个类似lisp和c++的函数,让vb coder不为排序发愁!尤其是autocad的vb开发者!
以下的代码参考自《VB真是想不到系列之三:VB指针葵花宝典之函数指针》的配套代码(原作者好像是:AdamBear),但原代码有一处小小错误,引起排序的不正确,我在以下代码中已修改!
当然还是首先上测试代码:

没有的函数或方法,到http://bbs.mjtd.com/thread-111783-1-1.html找去!
  1. Private Sub Command1_Click()
  2.     'On Error GoTo err1
  3.     AppActivate objCad.Caption

  4.     Dim objSset As AcadSelectionSet
  5.     Dim objDoc As AcadDocument
  6.     Set objDoc = ThisDrawing()
  7.     SelectLots "MEA~PL~TMP~123", "text"
  8.     Set objSset = objDoc.SelectionSets("MEA~PL~TMP~123")
  9.     If objSset.Count = 0 Then Exit Sub
  10.     Dim objArr() As AcadText, i As Long
  11.     ReDim objArr(objSset.Count - 1)
  12.     For i = 0 To objSset.Count - 1
  13.         Set objArr(i) = objSset.Item(i)
  14.     Next i
  15.     '快速排序
  16.    ' Call C_qsort(VarPtr(objArr(0)), UBound(objArr) + 1, 4, AddressOf CompareFunc)
  17.    '希尔排序
  18.     Call ShellSortAny(VarPtr(objArr(0)), UBound(objArr) + 1, 4, AddressOf CompareFunc)
  19.     For i = 0 To UBound(objArr)
  20.         objArr(i).TextString = objArr(i).TextString & CStr(i)
  21.     Next i
  22. End Sub

测试代码的效果简单明了:对文本排序,按顺序在后面加数字!
接下来是比较函数,这个函数是你排序时自定的比较回调函数,主要目的是表达对什么排序(如本例中是对text的插入点的x坐标进行排序),以什么次序排序(从大到小,还是从小到大,本例中是从小到大排列,如果对Ret变量再取负,就是从大到小了)
  1. '比较函数
  2. Function CompareFunc(Elem1 As AcadText, _
  3.     Elem2 As AcadText, _
  4.     unused1 As Long, _
  5.     unused2 As Long) As Integer
  6.     Dim Ret As Integer

  7. '    Debug.Print Elem1.InsertionPoint(0), Elem2.InsertionPoint(0)
  8.     Ret = Sgn(Elem1.InsertionPoint(0) - Elem2.InsertionPoint(0))
  9.     CompareFunc = Ret
  10. End Function

比较函数下载:

接下为是最关键的排序代码,一个是快速排序,一个是希尔排序,两个可以自由选择,调用代码都在上面(看注释掉的!)
这两个排序代码,是万年不用变的(如果没什么特殊情况),也就是相当于Lisp中的vl-sort函数和C++中的qsort函数。

为了光大vb版,所有附件免币!

希望看的懂回复一下!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-2-12 15:26:00 | 显示全部楼层
排序算法是很重要的,这段时间正在研究各种排序如:快速排序、希尔排序、堆排序、插入排序、冒泡排序、选择排序、基数排序、归并排序。
不错,支持楼主。
 楼主| 发表于 2015-2-12 22:16:14 | 显示全部楼层
wwswwswws 发表于 2015-2-12 15:26
排序算法是很重要的,这段时间正在研究各种排序如:快速排序、希尔排序、堆排序、插入排序、冒泡排序、选择 ...

实际上,这么算法都是成型的,而每个程序员都重新学一遍,的确没太大意义,完全可以用现成的,一劳永逸的,现在.net也已经自带排序功能了
发表于 2015-2-15 17:10:17 | 显示全部楼层
哦  我直接搞了书上例子的源代码
CAD实体排序要有容差才行

点评

你要是细看哪张动图,就知道有容差在里面了!多个文字a根本没对齐  发表于 2017-8-8 20:24
发表于 2016-10-21 15:58:48 | 显示全部楼层
学习了呵呵,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 02:00 , Processed in 0.168801 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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