猿问

VBA数组排序函数?

VBA数组排序函数?

我正在为VBA中的数组寻找一个合适的排序实现。最好是速战速决。或任何其他排序算法除了泡泡或合并之外,就足够了。

请注意,这是与MSProject 2003一起使用的,因此应该避免使用任何Excel本机函数和任何与.NET相关的内容。


慕哥6287543
浏览 1613回答 3
3回答

12345678_0001

我将“快速排序”算法转换为VBA,如果其他人想要的话。我对其进行了优化,以便在Int/Longs数组上运行,但将其转换为对任意可比较元素工作的方法应该非常简单。Private&nbsp;Sub&nbsp;QuickSort(ByRef&nbsp;a()&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;l&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;r&nbsp;As&nbsp;Long) &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;M&nbsp;As&nbsp;Long,&nbsp;i&nbsp;As&nbsp;Long,&nbsp;j&nbsp;As&nbsp;Long,&nbsp;v&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;M&nbsp;=&nbsp;4 &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;((r&nbsp;-&nbsp;l)&nbsp;>&nbsp;M)&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;(r&nbsp;+&nbsp;l)&nbsp;/&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;(a(l)&nbsp;>&nbsp;a(i))&nbsp;Then&nbsp;swap&nbsp;a,&nbsp;l,&nbsp;i&nbsp;'//&nbsp;Tri-Median&nbsp;Methode!' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;(a(l)&nbsp;>&nbsp;a(r))&nbsp;Then&nbsp;swap&nbsp;a,&nbsp;l,&nbsp;r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;(a(i)&nbsp;>&nbsp;a(r))&nbsp;Then&nbsp;swap&nbsp;a,&nbsp;i,&nbsp;r &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;r&nbsp;-&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap&nbsp;a,&nbsp;i,&nbsp;j &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;l &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;a(j) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do:&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;1:&nbsp;Loop&nbsp;While&nbsp;(a(i)&nbsp;<&nbsp;v) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do:&nbsp;j&nbsp;=&nbsp;j&nbsp;-&nbsp;1:&nbsp;Loop&nbsp;While&nbsp;(a(j)&nbsp;>&nbsp;v) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;(j&nbsp;<&nbsp;i)&nbsp;Then&nbsp;Exit&nbsp;Do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap&nbsp;a,&nbsp;i,&nbsp;j&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap&nbsp;a,&nbsp;i,&nbsp;r&nbsp;-&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QuickSort&nbsp;a,&nbsp;l,&nbsp;j &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QuickSort&nbsp;a,&nbsp;i&nbsp;+&nbsp;1,&nbsp;r&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;IfEnd&nbsp;SubPrivate&nbsp;Sub&nbsp;swap(ByRef&nbsp;a()&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;i&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;j&nbsp;As&nbsp;Long) &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;T&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;=&nbsp;a(i) &nbsp;&nbsp;&nbsp;&nbsp;a(i)&nbsp;=&nbsp;a(j) &nbsp;&nbsp;&nbsp;&nbsp;a(j)&nbsp;=&nbsp;TEnd&nbsp;SubPrivate&nbsp;Sub&nbsp;InsertionSort(ByRef&nbsp;a(),&nbsp;ByVal&nbsp;lo0&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;hi0&nbsp;As&nbsp;Long) &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;i&nbsp;As&nbsp;Long,&nbsp;j&nbsp;As&nbsp;Long,&nbsp;v&nbsp;As&nbsp;Long &nbsp;&nbsp;&nbsp;&nbsp;For&nbsp;i&nbsp;=&nbsp;lo0&nbsp;+&nbsp;1&nbsp;To&nbsp;hi0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;=&nbsp;a(i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;While&nbsp;j&nbsp;>&nbsp;lo0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;Not&nbsp;a(j&nbsp;-&nbsp;1)&nbsp;>&nbsp;v&nbsp;Then&nbsp;Exit&nbsp;Do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a(j)&nbsp;=&nbsp;a(j&nbsp;-&nbsp;1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;j&nbsp;-&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a(j)&nbsp;=&nbsp;v&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;iEnd&nbsp;SubPublic&nbsp;Sub&nbsp;sort(ByRef&nbsp;a()&nbsp;As&nbsp;Long) &nbsp;&nbsp;&nbsp;&nbsp;QuickSort&nbsp;a,&nbsp;LBound(a),&nbsp;UBound(a) &nbsp;&nbsp;&nbsp;&nbsp;InsertionSort&nbsp;a,&nbsp;LBound(a),&nbsp;UBound(a)End&nbsp;Sub

慕标琳琳

解释在德文中,代码是一个经过良好测试的就地实现:Private&nbsp;Sub&nbsp;QuickSort(ByRef&nbsp;Field()&nbsp;As&nbsp;String,&nbsp;ByVal&nbsp;LB&nbsp;As&nbsp;Long,&nbsp;ByVal&nbsp;UB&nbsp;As&nbsp;Long) &nbsp;&nbsp;&nbsp;&nbsp;Dim&nbsp;P1&nbsp;As&nbsp;Long,&nbsp;P2&nbsp;As&nbsp;Long,&nbsp;Ref&nbsp;As&nbsp;String,&nbsp;TEMP&nbsp;As&nbsp;String &nbsp;&nbsp;&nbsp;&nbsp;P1&nbsp;=&nbsp;LB &nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;UB &nbsp;&nbsp;&nbsp;&nbsp;Ref&nbsp;=&nbsp;Field((P1&nbsp;+&nbsp;P2)&nbsp;/&nbsp;2) &nbsp;&nbsp;&nbsp;&nbsp;Do &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;While&nbsp;(Field(P1)&nbsp;<&nbsp;Ref) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1&nbsp;=&nbsp;P1&nbsp;+&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do&nbsp;While&nbsp;(Field(P2)&nbsp;>&nbsp;Ref) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;P2&nbsp;-&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;P1&nbsp;<=&nbsp;P2&nbsp;Then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TEMP&nbsp;=&nbsp;Field(P1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field(P1)&nbsp;=&nbsp;Field(P2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field(P2)&nbsp;=&nbsp;TEMP &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1&nbsp;=&nbsp;P1&nbsp;+&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P2&nbsp;=&nbsp;P2&nbsp;-&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;If &nbsp;&nbsp;&nbsp;&nbsp;Loop&nbsp;Until&nbsp;(P1&nbsp;>&nbsp;P2) &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;LB&nbsp;<&nbsp;P2&nbsp;Then&nbsp;Call&nbsp;QuickSort(Field,&nbsp;LB,&nbsp;P2) &nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;P1&nbsp;<&nbsp;UB&nbsp;Then&nbsp;Call&nbsp;QuickSort(Field,&nbsp;P1,&nbsp;UB)End&nbsp;Sub像这样被引用:Call&nbsp;QuickSort(MyArray,&nbsp;LBound(MyArray),&nbsp;UBound(MyArray))
随时随地看视频慕课网APP
我要回答