温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sorting - VBA array sort function?
arrays sorting vb6 vba ms-project

sorting - VBA数组排序功能?

发布于 2020-04-26 18:57:29

我正在寻找一种在VBA中对数组进行良好排序的实现。最好使用Quicksort。或者,除了冒泡或合并以外的任何其他排序算法都足够。

请注意,这是与MS Project 2003一起使用的,因此应避免使用任何Excel本机功能以及与.net相关的任何内容。

查看更多

提问者
Mark Nold
被浏览
22
9,189 2019-03-26 11:25

在这里看看
编辑: 引用的源(allexperts.com)此后已经关闭,但是这里是相关的作者评论:

网上有很多算法可用于排序。功能最广泛且通常最快的是Quicksort算法下面是它的功能。

只需通过下数组边界(通常是0)和上数组边界(即UBound(myArray)传递值(字符串或数字;没关系)的数组来调用它

范例Call QuickSort(myArray, 0, UBound(myArray))

完成后,myArray将进行排序,您可以使用它来做自己想做的事情。
(来源:archive.org

Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
  Dim pivot   As Variant
  Dim tmpSwap As Variant
  Dim tmpLow  As Long
  Dim tmpHi   As Long

  tmpLow = inLow
  tmpHi = inHi

  pivot = vArray((inLow + inHi) \ 2)

  While (tmpLow <= tmpHi)
     While (vArray(tmpLow) < pivot And tmpLow < inHi)
        tmpLow = tmpLow + 1
     Wend

     While (pivot < vArray(tmpHi) And tmpHi > inLow)
        tmpHi = tmpHi - 1
     Wend

     If (tmpLow <= tmpHi) Then
        tmpSwap = vArray(tmpLow)
        vArray(tmpLow) = vArray(tmpHi)
        vArray(tmpHi) = tmpSwap
        tmpLow = tmpLow + 1
        tmpHi = tmpHi - 1
     End If
  Wend

  If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
  If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
End Sub

请注意,这仅适用于一维(也称为“正常”?)阵列。(有一个工作的多维数组快速排序在这里。)