排序2D数组 - VBScript - RadixSort最快 - 整数 - 代码请求

时间:2013-03-09 07:19:39

标签: algorithm optimization vbscript sorting

您能否协助/请求代码片段进行有效排序。 无法找到vbscript的基数排序 - 2D数组/能够很好地实现。

我的数组的示例结构是:

resultarray(0,1) = "Name1"
resultarray(1,1) = "Score1"
resultarray(2,1) = "Category1"
resultarray(3,1) = "OtherDetail1"
resultarray(4,1) = "OtherDetail1"
resultarray(5,1) = "OtherDetail1"

resultarray(0,2) = "Name2"
resultarray(1,2) = "Score2"
resultarray(2,2) = "Category2"
resultarray(3,2) = "OtherDetail2"
resultarray(4,2) = "OtherDetail2"
resultarray(5,2) = "OtherDetail2"

resultarray(0,3) = "Name3"
resultarray(1,3) = "Score3"
resultarray(2,3) = "Category3"
resultarray(3,3) = "OtherDetail3"
resultarray(4,3) = "OtherDetail3"
resultarray(5,3) = "OtherDetail3"

必须根据第二列对数组进行排序,即分数。 行数约为几百万。 分数将始终为正整数(在不久的将来将需要两位小数)。 速度非常重要,因为必须针对30到40个不同的群体进行数万至数百万的范围。

目前正好使用 Quicksort

http://www.4guysfromrolla.com/webtech/012799-3.shtml

我已经互换了行< - >在我的实现中的列,然后这工作正常。 但是很慢。 是否值得从现有的QuickSort中更改排序技术。

我打算稍后使用二进制搜索,根据分数匹配搜索大约2000个元素。

由于

3 个答案:

答案 0 :(得分:0)

这样的事情(使用最大分数作为sortedarray的上部维度):

Dim sortedarray(5, MAXIMUM_SCORE_GOES_HERE)
for i=LBound(resultarray) to UBound(resultarray)
    idxTarget = resultarray(1,i);
    sortedarray(0,idxTarget) = resultarray(0,i)
    sortedarray(1,idxTarget) = resultarray(1,i)
    sortedarray(2,idxTarget) = resultarray(2,i)
    sortedarray(3,idxTarget) = resultarray(3,i)
    sortedarray(4,idxTarget) = resultarray(4,i)
    sortedarray(5,idxTarget) = resultarray(5,i)
Next

它是Radix排序,没有基数部分。它没有比这更快。我按原样展开了“内部循环”,但是内部循环可能会更快:不是索引第一个维度,尝试循环它,它实际上可能更快。您也可以尝试For Each ... Next而不是上面写的for循环:有时For Each更快。但就排序算法而言,更快是不可能的。

答案 1 :(得分:0)

我不知道您更改和弯曲数据有多灵活,但您可以使用ArrayList并对其执行Sort方法。这是一个概念证明:

option explicit
' Create an arraylist to add items to
Dim i, score, t
dim list : Set list = CreateObject("System.Collections.ArrayList")

for i = 0 to 1000000
        ' Make an arbitrairy score between 0 and 100
        score = cint(rnd*100)
        ' pad with zero's to make the sort work correctly
        score = string(3 - len(score), "0") & score
        ' Add it to the arraylist
        list.add join(array(score, "name", "category", "details1", "details2", "details3"), vbTab)
Next

' Sort the list
t = timer()
list.sort

' Show the list
wscript.echo "duration: " & timer() - t
wscript.echo join(list.toArray(), vbNewLine)

这将返回2.6秒的持续时间,以便在我的机器(Intel i5)上排序1.000.000项。

如前所述,您无法直接在数据格式上使用它,但如果性能是一项重要要求,则可能需要更改数据模型。

答案 2 :(得分:0)

说明原因

  1. 您不应该复制ArrayList中原始数组中的数据,而是使用/存储索引
  2. SortedList适用于分组(不排序)的问题
  3. 概念证明脚本:

      Dim nRecs : nRecs = 100
      ReDim aOrg(1, nRecs)
      Dim i
      For i = 1 To nRecs ' aOrg[0] intentinally wasted
          aOrg(0, i) = "Item " &  i
          aOrg(1, i) = IRandR(5, 16)
      Next
      Dim slX : Set slX = CreateObject("System.Collections.SortedList")
      For i = 1 To nRecs
          If Not slX.Contains(aOrg(1, i)) Then Set slX(aOrg(1, i)) = CreateObject("System.Collections.ArrayList")
          slX(aOrg(1, i)).Add i
      Next
      For i = 0 To slX.Count - 1
          WScript.Echo "---- #", i, "score:", slX.GetKey(i)
          WScript.Echo vbTab, Join(slX.GetByIndex(i).ToArray())
          WScript.Echo vbTab, Join(GetCargo(aOrg, slX.GetByIndex(i)))
      Next
    
    Function GetCargo(aO, aI)
      ReDim aTmp(aI.Count - 1)
      Dim i
      For i = 0 To UBound(aTmp)
          aTmp(i) = aO(0, aI(i))
      Next
      GetCargo = aTmp
    End Function
    

    输出:

    ---- # 0 score: 5
             7 11 18 23 44 50 69 85 96 99
             Item 7 Item 11 Item 18 Item 23 Item 44 Item 50 Item 69 Item 85 Item 96 Item 99
    ---- # 1 score: 6
             41 46 47 58 59 80
             Item 41 Item 46 Item 47 Item 58 Item 59 Item 80
    ---- # 2 score: 7
             29 36 39 66 67 72 95 97
             Item 29 Item 36 Item 39 Item 66 Item 67 Item 72 Item 95 Item 97
    ---- # 3 score: 8
             4 5 26 30 49 51 53 57 64 75 93
             Item 4 Item 5 Item 26 Item 30 Item 49 Item 51 Item 53 Item 57 Item 64 Item 75 Item 93
    ---- # 4 score: 9
             12 15 20 52 56 61 62 74 79 88 94 100
             Item 12 Item 15 Item 20 Item 52 Item 56 Item 61 Item 62 Item 74 Item 79 Item 88 Item 94 Item 100
    ---- # 5 score: 10
             2 21 25 40 70 86 90 91 92
             Item 2 Item 21 Item 25 Item 40 Item 70 Item 86 Item 90 Item 91 Item 92
    ---- # 6 score: 11
             3 24 27 33 45 65 68 77 78 81
             Item 3 Item 24 Item 27 Item 33 Item 45 Item 65 Item 68 Item 77 Item 78 Item 81
    ---- # 7 score: 12
             1 10 28 37 43 60 63 82 89
             Item 1 Item 10 Item 28 Item 37 Item 43 Item 60 Item 63 Item 82 Item 89
    ---- # 8 score: 13
             6 8 9 14 22 48 73
             Item 6 Item 8 Item 9 Item 14 Item 22 Item 48 Item 73
    ---- # 9 score: 14
             13 17 31 32 71 84
             Item 13 Item 17 Item 31 Item 32 Item 71 Item 84
    ---- # 10 score: 15
             16 19 34 35 38 42 54 55 76 83 87 98
             Item 16 Item 19 Item 34 Item 35 Item 38 Item 42 Item 54 Item 55 Item 76 Item 83 Item 87 Item 98