一起来探索最好的排序方案

老熊宝宝 2002-03-07 07:44:20
在我写完《VB指针葵花宝典》后,总觉得忐忑不安,因为文章里好象都是在谈内功心法,而没有厉害的招数。尤其是函数指针的问题,虽想一笔带过,实际上反而成了那篇文章的鸡肋,实际上函数指针是很值得一谈的。于是,我决定再写一篇文章谈谈指针尤其是函数指针的的深入应用,并决定从排序下手。关于排序的问题,对于VB尤其有意义,因为和C和JAVA不一样,VB没有直接提供排序的函数,因此用来排序的方法堪称百花齐放。
那么你在实际使用中,常采用什么样的排序方法呢?用ListBox来Sort?就在VB里写个qsort?用不用递归呢?还是根本就不在VB里做?有没有免费的比较好的组件或DLL?
我们讨论的目的是找出一个平均性能不错,通用性好,综合的数组排序解决方案。不强求用纯VB来做,但至少VB中要用得方便,支持升降序、支持自定义的比较函数,支持各种数据类型,支持……
你的方案是什么?大家来讨论一下吧!
...全文
412 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
老熊宝宝 2002-03-14
  • 打赏
  • 举报
回复
我越来越觉得要给出一个最好的排序算法是不可能的了。
我比较了一下多种排序算法,都不可能说最快。
但是,应该能从小地方来提升效率,同一个算法,用不同代码实现效率大
不一样。
第三篇文章已经写完,今晚来贴。
今晚结帐。
yaos 2002-03-12
  • 打赏
  • 举报
回复
请参考周建钦的《超快速排序算法》(科学出版社)
书里提出了很好的算法!!

老熊宝宝 2002-03-11
  • 打赏
  • 举报
回复
to Bardo(巴顿):
谢谢,的确,打混也是一个非常重要的功能,多模即余本身就是一个产生
随机数的方法,我在VC里改写Rnd函数用的是VC一个例子代码里的方法,重复
机率虽小,但不能保证不重复,我为再研究一下这个问题。

to 所有朋友:
这两天,在指针技术的研究上,我又有重大进展。我仔细研究了BSTR和
SAFEARRAY指针在VB里所能进行的HACK,结果实在是让我惊叹不已。我已经
能将String变量放到自已分配的内存地址上,虽然以后写这个String必须要
用MID语句(因为VB任何对一次字串符值都要进行内存重新分配),这个技术
的重大意义在于我可以极大的改进共享内存的方法,我可以让多个实例里的
字串指向同一个内存地址,访问效率很高(我原来发布的那个例子代码中,
每次访问,都必须进行字串的拷贝。),等着,字串的重要革命要开始了。
而对SAFEARRAY的研究,得益于VBPJ上的一位大师的指点(一个源代
码),我已经掌握了将SAFEARRAY的pvData指针数组拿出来的办法,这样以后
排序,我们只要对一个long型的指针数组进行排序,我们可以大大节约堆栈
空间,在VB里我们也可以进行递归了。
呵呵。等着,这次,要拿出一个更让人吃惊的东西了,所以还请等两天,
我要把这篇文章写好。上次那篇文章没有进行好好和检查,我现在要发现了
几处明显的错误(小错误),这次,要仔细了。

Bardo 2002-03-11
  • 打赏
  • 举报
回复
我的想法,既然谈了排序,同时也应当谈谈混洗!!!
以前有本书《Visual Basic 4.0 开发人员指南》中就有一个混洗代码:
好象是用mOut(i+1)=(p*(mOut(i)+q*m)mod n,这个递推式写成的,
前几日就有人问,如果获得不重复的随机数,实际是上面只是一种方法
但我并没有能收集到更多的代码!
bdzwc 2002-03-10
  • 打赏
  • 举报
回复
数据结构课上都讲吧
冒泡法,插入法,二分法,SHELL排序,堆排序,QUICKSORT,归并排序,等等
wgku 2002-03-10
  • 打赏
  • 举报
回复
AdamBear(学习再学习)我支持你
tangyong_delphi 2002-03-10
  • 打赏
  • 举报
回复
二分法
老熊宝宝 2002-03-10
  • 打赏
  • 举报
回复
是不是大家对这个话题不兴趣呢?又或者是大家都忙着抢分,没时间
去研究排序这种理论上的玩艺?我怎么觉得没有研究讨论的气氛呢?是不
是觉得我上面说得已经够了,我上面说的话有不少错误为什么没人指出来
呢?我喜欢直言别人的错误和不足,也欢迎别人指正我的错误和不足?我
从来就不怕自己说错,说错了可以改。需要的就是敢说,敢于挑战任何人
的东西,敢于瞧不起别人的东西,敢于吹牛(我好象在别的贴子上说过这
些),吹牛能让人进步,只要你向你所吹的去努力。从我学电脑开始,我
就在吹牛,那时我还没有电脑,经常把电脑报上看来的东西吹成自己的,
我的朋友都知道我会吹,都很佩服我。大多数时候,我吹的东西都是真的,
我都能去实现,但有时牛皮也会吹破,那时我会老实的承认自己错了,没
什么,朋友不会在意,因为和我吹成功的比起来,我吹失败的次数不多。
瞧不起别人的东西是好事(只是在技术上,不是在为人处事上),有这种
精神,技术才会进步,大师的东西都我敢瞧不起,所以巴顿你上面瞧不起
我根本就不算什么,相反我很佩服你,你贴的那些算法已经是比较全面了,
在VB里凭这些算法,的确可以吹是"所有精典"了。我来CSDN不长,但在VB
版吹过的牛不少,吹破的也有不少了,这是因为我喜欢在结果出来之前就
吹嘛,可以让大家知道我的研究过程,因为只知道正确的结果不算什么,
知道经过了多次失败后的正确结果才更有意义,如果还能发现更好的结果
那就更有意义。所以,我认为我们在解答别人的问题的时候,不要一开始
就给出最好的方案(哪怕你知道什么最好),甚至留点错误也不算什么,
让得到提出问题的人自己试试,远比贴出现成的最优的代码要有意义得多。
所以,我们更不应该怕自己说错,说错了从某种意义上说比直接说对了更
有意义。所以,我们应该欢迎大师的错误和不足,我的错误和不足,巴顿
的错误和不足,这些错误和不足都在让我们进步。

现在让我们来看看我楼上那一大段里,到底有那些错误。
1、我说我要在VC里实现一个通用的排序API,我说这会是最好的方法。
嘿嘿,说得容易,我今天几乎花了一天时间来想看底该怎样来实现我吹
的这个牛,现在还没有眉目,我学VC不过半年,真要做点东西还有很多要学,
这个牛吹得好,我会继续努力。
现在的问题是,我还不能保证VC做出的东西就一定比VB快,因为要通用就
得用VARIANT的SAFEARRAY,用VarCmp来比较,这完全是在用COM自动化的方法。
而我们知道VB处理这些东西都已经是高度的优化了的,我们的算法绝大部分时
间都在了Oleaut32.dll里,我们体现不出VC的优势,而且用Variant本身就很
慢,在VC里也一样。如果不用Variant,而用void*,我们必须要回调VB的比较
函数,否则就要实现多个不同类型的版本,回调的效率高不高,直接决定最终
的算法的可行性。
由于这些因素,我还没有下定决定做下去。所以想请VB和VC混合编程的
高手指点一下,你们认为我到底该怎么做。

2、我上面还有一处说错,SHELL排序的时间复杂度不是n*log2(n),SEHLL排序
的时间复杂度的计算到现在为止,也没有公认正确的计算方法。Knuth大师通
过统计资料提出,当n很大时它的平均比较和移动次数大约在n的1.25次方的1
到1.6倍,比nLog2(n)稍慢一些。实际上它是最有争议的排序方式之一,对步
长的选择方式至今没有定论,巴顿上面的SHELL排序用的折半的步长也是通用
的方法之一,Knuth大师提出应该取dist=(dist/3)+1。所以,并不能说它就是
最好的方法,虽然它实现起来简单。各个语言的实际应用中,它正好是用得最
少的方法,嘿嘿,是不是有人被我骗了。

3、还有三个地方我上面没有考虑到:一个就是我只关注运行时间,没有考虑
空间上的需求,二是只考虑平均性能没有考虑最坏情况下的性能,三是没有
考虑稳定性。
实际上,在JAVA的实现中,对对象类型采用的是Mergesort,因为它是一个

稳定的n*log2(n)算法。而在最坏情况下也是n*log2(n),并且空间用的最少
的算法是HeapSort,但堆排序不稳定。
所以说,相比之下,若不在意稳定性(谁在意呢?),HeapSort才应该是
最好的方法。所以,楼上fling_boy(男孩)我会多给点分。
但由于实现上的复杂性,我们还需要真正的测试一下,我的文章再来谈
最终的测试结果。

4、类型的处理上
这不是说我的错,而是说巴顿的代码上的不足,用Variant是非常慢的,
如SHELL排序,我实际测试的结果是比我用指针做的慢3倍。而且Variant不是
万能的,依然应该考虑传入对象数组时怎么办,这时必须考虑将对象的缺省属
性变成Variant来参与比较,这样比直接用对象做还要慢1倍。所以,没错,不
要看《Advanced VB》这本好书上有几位作者说我们应该用Variant,我们就要
用,理论上除非是非用不可,我们尽量不要用Variant,实在是太慢了!

希望大家踊跃发言,不要怕说错,技术的进步需要每个人的参与!
算了,今天该睡了,明天还要写文章。
老熊宝宝 2002-03-10
  • 打赏
  • 举报
回复
是不是大家对这个话题不兴趣呢?又或者是大家都忙着抢分,没时间
去研究排序这种理论上的玩艺?我怎么觉得没有研究讨论的气氛呢?是不
是觉得我上面说得已经够了,我上面说的话有不少错误为什么没人指出来
呢?我喜欢直言别人的错误和不足,也欢迎别人指正我的错误和不足?我
从来就不怕自己说错,说错了可以改。需要的就是敢说,敢于挑战任何人
的东西,敢于瞧不起别人的东西,敢于吹牛(我好象在别的贴子上说过这
些),吹牛能让人进步,只要你向你所吹的去努力。从我学电脑开始,我
就在吹牛,那时我还没有电脑,经常把电脑报上看来的东西吹成自己的,
我的朋友都知道我会吹,都很佩服我。大多数时候,我吹的东西都是真的,
我都能去实现,但有时牛皮也会吹破,那时我会老实的承认自己错了,没
什么,朋友不会在意,因为和我吹成功的比起来,我吹失败的次数不多。
瞧不起别人的东西是好事(只是在技术上,不是在为人处事上),有这种
精神,技术才会进步,大师的东西都我敢瞧不起,所以巴顿你上面瞧不起
我根本就不算什么,相反我很佩服你,你贴的那些算法已经是比较全面了,
在VB里凭这些算法,的确可以吹是"所有精典"了。我来CSDN不长,但在VB
版吹过的牛不少,吹破的也有不少了,这是因为我喜欢在结果出来之前就
吹嘛,可以让大家知道我的研究过程,因为只知道正确的结果不算什么,
知道经过了多次失败后的正确结果才更有意义,如果还能发现更好的结果
那就更有意义。所以,我认为我们在解答别人的问题的时候,不要一开始
就给出最好的方案(哪怕你知道什么最好),甚至留点错误也不算什么,
让得到提出问题的人自己试试,远比贴出现成的最优的代码要有意义得多。
所以,我们更不应该怕自己说错,说错了从某种意义上说比直接说对了更
有意义。所以,我们应该欢迎大师的错误和不足,我的错误和不足,巴顿
的错误和不足,这些错误和不足都在让我们进步。

现在让我们来看看我楼上那一大段里,到底有那些错误。
1、我说我要在VC里实现一个通用的排序API,我说这会是最好的方法。
嘿嘿,说得容易,我今天几乎花了一天时间来想看底该怎样来实现我吹
的这个牛,现在还没有眉目,我学VC不过半年,真要做点东西还有很多要学,
这个牛吹得好,我会继续努力。
现在的问题是,我还不能保证VC做出的东西就一定比VB快,因为要通用就
得用VARIANT的SAFEARRAY,用VarCmp来比较,这完全是在用COM自动化的方法。
而我们知道VB处理这些东西都已经是高度的优化了的,我们的算法绝大部分时
间都在了Oleaut32.dll里,我们体现不出VC的优势,而且用Variant本身就很
慢,在VC里也一样。如果不用Variant,而用void*,我们必须要回调VB的比较
函数,否则就要实现多个不同类型的版本,回调的效率高不高,直接决定最终
的算法的可行性。
由于这些因素,我还没有下定决定做下去。所以想请VB和VC混合编程的
高手指点一下,你们认为我到底该怎么做。

2、我上面还有一处说错,SHELL排序的时间复杂度不是n*log2(n),SEHLL排序
的时间复杂度的计算到现在为止,也没有公认正确的计算方法。Knuth大师通
过统计资料提出,当n很大时它的平均比较和移动次数大约在n的1.25次方的1
到1.6倍,比nLog2(n)稍慢一些。实际上它是最有争议的排序方式之一,对步
长的选择方式至今没有定论,巴顿上面的SHELL排序用的折半的步长也是通用
的方法之一,Knuth大师提出应该取dist=(dist/3)+1。所以,并不能说它就是
最好的方法,虽然它实现起来简单。各个语言的实际应用中,它正好是用得最
少的方法,嘿嘿,是不是有人被我骗了。

3、还有三个地方我上面没有考虑到:一个就是我只关注运行时间,没有考虑
空间上的需求,二是只考虑平均性能没有考虑最坏情况下的性能,三是没有
考虑稳定性。
实际上,在JAVA的实现中,对对象类型采用的是Mergesort,因为它是一个稳定的n*log2(n)算法。而在最坏情况下也是n*log2(n),并且空间用的最少
的算法是HeapSort,但堆排序不稳定。
所以说,相比之下,若不在意稳定性(谁在意呢?),HeapSort才应该是
最好的方法。所以,楼上fling_boy(男孩)我会多给点分。
但由于实现上的复杂性,我们还需要真正的测试一下,我的文章再来谈
最终的测试结果。

4、类型的处理上
这不是说我的错,而是说巴顿的代码上的不足,用Variant是非常慢的,
如SHELL排序,我实际测试的结果是比我用指针做的慢3倍。而且Variant不是
万能的,依然应该考虑传入对象数组时怎么办,这时必须考虑将对象的缺省属
性变成Variant来参与比较,这样比直接用对象做还要慢1倍。所以,没错,不
要看《Advanced VB》这本好书上有几位作者说我们应该用Variant,我们就要
用,理论上除非是非用不可,我们尽量不要用Variant,实在是太慢了!

希望大家踊跃发言,不要怕说错,技术的进步需要每个人的参与!
算了,今天该睡了,明天还要写文章。
ccsheng 2002-03-09
  • 打赏
  • 举报
回复
学习学习.
fling_boy 2002-03-09
  • 打赏
  • 举报
回复
我用堆排序。
wgku 2002-03-09
  • 打赏
  • 举报
回复
哇。。。AdamBear(学习再学习) 你打字速度真快

巴顿的好东东不少啊:)
shawls 2002-03-09
  • 打赏
  • 举报
回复

我补充一点:

那个关于交换数据的:其实是交换指针的数据

也就是说:vb变量里面存储的是内存地址,交换地址就达到了交换数据的目的
Do_Better 2002-03-09
  • 打赏
  • 举报
回复
来学习
jett 2002-03-08
  • 打赏
  • 举报
回复
没看到有关于排序的,有不少
链接不过现在看不了,就是那些shtml的东西

后缀该成xml即可
Bardo 2002-03-08
  • 打赏
  • 举报
回复

Sub Insertion(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim TEMP
Dim NextElement

NextElement = LBound(MyArray) + 1
While (NextElement <= UBound(MyArray))
Index = NextElement
Do
If Index > LBound(MyArray) Then
If nOrder = ASCENDING_ORDER Then
If MyArray(Index) < MyArray(Index - 1) Then
TEMP = MyArray(Index)
MyArray(Index) = MyArray(Index - 1)
MyArray(Index - 1) = TEMP
Index = Index - 1
Else
Exit Do
End If
ElseIf nOrder = DESCENDING_ORDER Then
If MyArray(Index) >= MyArray(Index - 1) Then
TEMP = MyArray(Index)
MyArray(Index) = MyArray(Index - 1)
MyArray(Index - 1) = TEMP
Index = Index - 1
Else
Exit Do
End If
End If
Else
Exit Do
End If
gIterations = gIterations + 1
Loop
NextElement = NextElement + 1
gIterations = gIterations + 1
Wend

End Sub

Sub QuickSort(MyArray(), L, R)
Dim I, J, X, Y

I = L
J = R
X = MyArray((L + R) / 2)

While (I <= J)
While (MyArray(I) < X And I < R)
I = I + 1
Wend
While (X < MyArray(J) And J > L)
J = J - 1
Wend
If (I <= J) Then
Y = MyArray(I)
MyArray(I) = MyArray(J)
MyArray(J) = Y
I = I + 1
J = J - 1
End If
gIterations = gIterations + 1
Wend

If (L < J) Then Call QuickSort(MyArray(), L, J)
If (I < R) Then Call QuickSort(MyArray(), I, R)

End Sub

Sub Selection(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim Min
Dim NextElement
Dim TEMP

NextElement = 0
While (NextElement < UBound(MyArray))
Min = UBound(MyArray)
Index = Min - 1
While (Index >= NextElement)
If nOrder = ASCENDING_ORDER Then
If MyArray(Index) < MyArray(Min) Then
Min = Index
End If
ElseIf nOrder = DESCENDING_ORDER Then
If MyArray(Index) >= MyArray(Min) Then
Min = Index
End If
End If
Index = Index - 1
gIterations = gIterations + 1
Wend
TEMP = MyArray(Min)
MyArray(Min) = MyArray(NextElement)
MyArray(NextElement) = TEMP
NextElement = NextElement + 1
gIterations = gIterations - 1
Wend

End Sub

Sub ShellSort(MyArray(), ByVal nOrder As Integer)
Dim Distance
Dim Size
Dim Index
Dim NextElement
Dim TEMP

Size = UBound(MyArray) - LBound(MyArray) + 1
Distance = 1

While (Distance <= Size)
Distance = 2 * Distance
Wend

Distance = (Distance / 2) - 1

While (Distance > 0)

NextElement = LBound(MyArray) + Distance

While (NextElement <= UBound(MyArray))
Index = NextElement
Do
If Index >= (LBound(MyArray) + Distance) Then
If nOrder = ASCENDING_ORDER Then
If MyArray(Index) < MyArray(Index - Distance) Then
TEMP = MyArray(Index)
MyArray(Index) = MyArray(Index - Distance)
MyArray(Index - Distance) = TEMP
Index = Index - Distance
gIterations = gIterations + 1
Else
Exit Do
End If
ElseIf nOrder = DESCENDING_ORDER Then
If MyArray(Index) >= MyArray(Index - Distance) Then
TEMP = MyArray(Index)
MyArray(Index) = MyArray(Index - Distance)
MyArray(Index - Distance) = TEMP
Index = Index - Distance
gIterations = gIterations + 1
Else
Exit Do
End If
End If
Else
Exit Do
End If
Loop
NextElement = NextElement + 1
gIterations = gIterations + 1
Wend
Distance = (Distance - 1) / 2
gIterations = gIterations + 1
Wend

End Sub
Bardo 2002-03-08
  • 打赏
  • 举报
回复
精典推荐:排序算法:
调用:
Call BubbleSort(mArray(), Order)
Call Insertion(mArray(), Order)
Call Bucket(mArray(), Order)
Call Selection(mArray(), Order)
Call ShellSort(mArray(), Order)
Call QuickSort(mArray(), 0, UBound(mArray))
Call Heap(mArray())



Option Explicit
Global Const ZERO = 0
Global Const ASCENDING_ORDER = 0
Global Const DESCENDING_ORDER = 1

Global gIterations

Sub BubbleSort(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim TEMP
Dim NextElement

NextElement = ZERO
Do While (NextElement < UBound(MyArray))
Index = UBound(MyArray)
Do While (Index > NextElement)
If nOrder = ASCENDING_ORDER Then
If MyArray(Index) < MyArray(Index - 1) Then
TEMP = MyArray(Index)
MyArray(Index) = MyArray(Index - 1)
MyArray(Index - 1) = TEMP
End If
ElseIf nOrder = DESCENDING_ORDER Then
If MyArray(Index) >= MyArray(Index - 1) Then
TEMP = MyArray(Index)
MyArray(Index) = MyArray(Index - 1)
MyArray(Index - 1) = TEMP
End If
End If
Index = Index - 1
gIterations = gIterations + 1
Loop
NextElement = NextElement + 1
gIterations = gIterations + 1
Loop

End Sub

Sub Bucket(MyArray(), ByVal nOrder As Integer)
Dim Index
Dim NextElement
Dim TheBucket

NextElement = LBound(MyArray) + 1
While (NextElement <= UBound(MyArray))
TheBucket = MyArray(NextElement)
Index = NextElement
Do
If Index > LBound(MyArray) Then
If nOrder = ASCENDING_ORDER Then
If TheBucket < MyArray(Index - 1) Then
MyArray(Index) = MyArray(Index - 1)
Index = Index - 1
Else
Exit Do
End If
ElseIf nOrder = DESCENDING_ORDER Then
If TheBucket >= MyArray(Index - 1) Then
MyArray(Index) = MyArray(Index - 1)
Index = Index - 1
Else
Exit Do
End If
End If
Else
Exit Do
End If
gIterations = gIterations + 1
Loop
MyArray(Index) = TheBucket
NextElement = NextElement + 1
gIterations = gIterations + 1
Wend

End Sub

Sub Heap(MyArray())
Dim Index
Dim Size
Dim TEMP

Size = UBound(MyArray)

Index = 1
While (Index <= Size)
Call HeapSiftup(MyArray(), Index)
Index = Index + 1
gIterations = gIterations + 1
Wend

Index = Size
While (Index > 0)
TEMP = MyArray(0)
MyArray(0) = MyArray(Index)
MyArray(Index) = TEMP
Call HeapSiftdown(MyArray(), Index - 1)
Index = Index - 1
gIterations = gIterations + 1
Wend

End Sub


Sub HeapSiftdown(MyArray(), M)
Dim Index
Dim Parent
Dim TEMP

Index = 0
Parent = 2 * Index

Do While (Parent <= M)

If (Parent < M And MyArray(Parent) < MyArray(Parent + 1)) Then
Parent = Parent + 1
End If

If MyArray(Index) >= MyArray(Parent) Then
Exit Do
End If

TEMP = MyArray(Index)
MyArray(Index) = MyArray(Parent)
MyArray(Parent) = TEMP

Index = Parent
Parent = 2 * Index

gIterations = gIterations + 1
Loop
End Sub

Sub HeapSiftup(MyArray(), M)
Dim Index
Dim Parent
Dim TEMP

Index = M
Do While (Index > 0)
Parent = Int(Index / 2)

If MyArray(Parent) >= MyArray(Index) Then
Exit Do
End If

TEMP = MyArray(Index)
MyArray(Index) = MyArray(Parent)
MyArray(Parent) = TEMP

Index = Parent
gIterations = gIterations + 1
Loop

End Sub
老熊宝宝 2002-03-08
  • 打赏
  • 举报
回复
今天一大早起来,要看看了巴顿专贴,越来越佩服巴顿了,呵呵。
直说,我的VB肯定没有你学得好,我就是爱乱玩,打一枪换个地方,不过
如果说我有什么优点的话,那就是学得快,向你学习。
你的专贴1、2,我又仔细看了看,不错,有些我在研究的东西,你已经
写过,不过,还不是说你的东西就是句号,有很多还值得深挖。
比如专贴2你用GlobalAlloc来实现什么共享内存,那是不对的,MSDN文档
里已经说得很清楚,那是为了兼容16位代码。关于内存共享,还是应该用
FileMapping,或者也可以试试DLL共享节,我的那个内存共享与进程通讯的
例子应该说是实现了,下一个版本准备实际命名管道和邮件槽,因为已经有人
在短消息里要了。
还有很多问题值得讨论,以后大家共同切磋,共同进步。
ceita 2002-03-08
  • 打赏
  • 举报
回复
请问:《巴顿专贴》在什么地方啊?
老熊宝宝 2002-03-08
  • 打赏
  • 举报
回复
to Bardo(巴顿) :你贴的这些排序算法都不错,不过你认为哪种最通用呢?

对不起,各位朋友,线下写的东西贴上来时有点走行了,请用小字体来看。
明天我再来看吧!希望有更多的议论!
加载更多回复(10)

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧