Excel Excal Listbox冒泡排序在大量数据上运行缓慢

Excel Excal Listbox冒泡排序在大量数据上运行缓慢,excel,vba,listbox,bubble-sort,Excel,Vba,Listbox,Bubble Sort,我使用以下代码对多列列表框中的数据进行排序。它根据第5列中的数字数据进行排序。它工作得很好,但当列表框中有大量数据时,速度非常慢 有没有更快的解决方案 Public Sub BubbleSort() Dim i As Long Dim j As Long Dim Temp4 As Variant, Temp3 As Variant, Temp2 As Variant, Temp1 As Variant, Temp0 As Variant, temp4string As String Wit

我使用以下代码对多列列表框中的数据进行排序。它根据第5列中的数字数据进行排序。它工作得很好,但当列表框中有大量数据时,速度非常慢

有没有更快的解决方案

Public Sub BubbleSort()

Dim i As Long
Dim j As Long
Dim Temp4 As Variant, Temp3 As Variant, Temp2 As Variant, Temp1 As Variant, Temp0 As Variant, temp4string As String


With Plybooks.ListBox1
    For i = 0 To .ListCount - 2
        For j = i + 1 To .ListCount - 1
                If IsLarger(.List(i, 4), .List(j, 4)) Then
                    Temp4 = CLng(.List(j, 4))
                    .List(j, 4) = .List(i, 4)
                    .List(i, 4) = Temp4
                    Temp3 = .List(j, 3)
                    .List(j, 3) = .List(i, 3)
                    .List(i, 3) = Temp3
                    Temp2 = .List(j, 2)
                    .List(j, 2) = .List(i, 2)
                    .List(i, 2) = Temp2
                    Temp1 = .List(j, 1)
                    .List(j, 1) = .List(i, 1)
                    .List(i, 1) = Temp1
                    Temp0 = .List(j, 0)
                    .List(j, 0) = .List(i, 0)
                    .List(i, 0) = Temp0
                End If
        Next j
    Next i
End With

End Sub

对于阵列建议:

Dim data
data = Plybooks.ListBox1.List
For i = Lbound(data) To UBound(data) - 1
    For j = Lbound(data) + 1 To UBound(data)
            If IsLarger(data(i, 4), data(j, 4)) Then
                Temp4 = CLng(data(j, 4))
                data(j, 4) = data(i, 4)
                data(i, 4) = Temp4
                Temp3 = data(j, 3)
                data(j, 3) = data(i, 3)
                data(i, 3) = Temp3
                Temp2 = data(j, 2)
                data(j, 2) = data(i, 2)
                data(i, 2) = Temp2
                Temp1 = data(j, 1)
                data(j, 1) = data(i, 1)
                data(i, 1) = Temp1
                Temp0 = data(j, 0)
                data(j, 0) = data(i, 0)
                data(i, 0) = Temp0
            End If
    Next j
Next i
Plybooks.ListBox1.List = data
不过,如果您可以在开始填充列表之前对数据进行排序,那会更好。我不知道为什么您需要一个单独的
IsLarger
函数,而不仅仅是使用


对于阵列建议:

Dim data
data = Plybooks.ListBox1.List
For i = Lbound(data) To UBound(data) - 1
    For j = Lbound(data) + 1 To UBound(data)
            If IsLarger(data(i, 4), data(j, 4)) Then
                Temp4 = CLng(data(j, 4))
                data(j, 4) = data(i, 4)
                data(i, 4) = Temp4
                Temp3 = data(j, 3)
                data(j, 3) = data(i, 3)
                data(i, 3) = Temp3
                Temp2 = data(j, 2)
                data(j, 2) = data(i, 2)
                data(i, 2) = Temp2
                Temp1 = data(j, 1)
                data(j, 1) = data(i, 1)
                data(i, 1) = Temp1
                Temp0 = data(j, 0)
                data(j, 0) = data(i, 0)
                data(i, 0) = Temp0
            End If
    Next j
Next i
Plybooks.ListBox1.List = data
不过,如果您可以在开始填充列表之前对数据进行排序,那会更好。我不知道为什么您需要一个单独的
IsLarger
函数,而不仅仅是使用


您的气泡不正确。下面是一般的冒泡排序。此外,冒泡排序在处理大量数据时固有的速度较慢

  sort (A, n)       // bubble sort array A[0..n-1]
  
    k= n-1;         // k holds position of last interchange. All higher elements are sorted.
    while (k > 0)
    {
        l= 0;
        for (j=0; j < k; j++)
        {
            if (A[j] > A[j+1])
            {
                tmp   = A[j];
                A[j]  = A[j+1];
                A[j+1]= tmp;
                l= j;
            }
        }
        k= l;       // remember last exchange. All higher elements are sorted.
    }
排序(A,n)//冒泡排序数组A[0..n-1] k=n-1;//k保持最后一个交换的位置。所有较高的元素都已排序。 而(k>0) { l=0; 对于(j=0;jA[j+1]) { tmp=A[j]; A[j]=A[j+1]; A[j+1]=tmp; l=j; } } k=l;//记住上次交换。所有较高的元素都已排序。 }
您的气泡不正确。下面是一般的冒泡排序。此外,冒泡排序在处理大量数据时固有的速度较慢

  sort (A, n)       // bubble sort array A[0..n-1]
  
    k= n-1;         // k holds position of last interchange. All higher elements are sorted.
    while (k > 0)
    {
        l= 0;
        for (j=0; j < k; j++)
        {
            if (A[j] > A[j+1])
            {
                tmp   = A[j];
                A[j]  = A[j+1];
                A[j+1]= tmp;
                l= j;
            }
        }
        k= l;       // remember last exchange. All higher elements are sorted.
    }
排序(A,n)//冒泡排序数组A[0..n-1] k=n-1;//k保持最后一个交换的位置。所有较高的元素都已排序。 而(k>0) { l=0; 对于(j=0;jA[j+1]) { tmp=A[j]; A[j]=A[j+1]; A[j+1]=tmp; l=j; } } k=l;//记住上次交换。所有较高的元素都已排序。 }
与其他排序算法相比,冒泡排序速度较慢。请参见上的时间复杂度比较

您可以使用预定义的方法对整个列表进行排序:

Dim arr2D as Variant
With Plybooks.ListBox1
    arr2D = .List
    Sort2DArray arr2D, 4 '4 being the exact column index you want to sort by
    .List = arr2D
End With

例如,您可以使用我刚才创建的稳定的快速排序。查看此内容并查找Sort2DArray函数

与其他排序算法相比,冒泡排序速度较慢。请参见上的时间复杂度比较

您可以使用预定义的方法对整个列表进行排序:

Dim arr2D as Variant
With Plybooks.ListBox1
    arr2D = .List
    Sort2DArray arr2D, 4 '4 being the exact column index you want to sort by
    .List = arr2D
End With

例如,您可以使用我刚才创建的稳定的快速排序。查看此内容并查找Sort2DArray函数

这似乎是冒泡排序的一种更快的替代方法。它在列表的btm以升序数字顺序对非数字数据进行排序

Dim data
data = Plybooks.ListBox1.List
For i = LBound(data) To UBound(data) - 1
    For j = LBound(data) To UBound(data)
            If IsLarger(data(j, 4), data(i, 4)) Then
                Temp4 = CLng(data(i, 4))
                data(i, 4) = data(j, 4)
                data(j, 4) = Temp4
                Temp3 = data(i, 3)
                data(i, 3) = data(j, 3)
                data(j, 3) = Temp3
                Temp2 = data(o, 2)
                data(o, 2) = data(j, 2)
                data(j, 2) = Temp2
                Temp1 = data(i, 1)
                data(i, 1) = data(j, 1)
                data(j, 1) = Temp1
                Temp0 = data(i, 0)
                data(i, 0) = data(j, 0)
                data(j, 0) = Temp0
                Temp5 = data(i, 5)
                data(i, 5) = data(j, 5)
                data(j, 5) = Temp5
            End If
   Next j
Next i
Plybooks.ListBox1.List = data

这似乎是一种比泡泡式更快的选择。它在列表的btm以升序数字顺序对非数字数据进行排序

Dim data
data = Plybooks.ListBox1.List
For i = LBound(data) To UBound(data) - 1
    For j = LBound(data) To UBound(data)
            If IsLarger(data(j, 4), data(i, 4)) Then
                Temp4 = CLng(data(i, 4))
                data(i, 4) = data(j, 4)
                data(j, 4) = Temp4
                Temp3 = data(i, 3)
                data(i, 3) = data(j, 3)
                data(j, 3) = Temp3
                Temp2 = data(o, 2)
                data(o, 2) = data(j, 2)
                data(j, 2) = Temp2
                Temp1 = data(i, 1)
                data(i, 1) = data(j, 1)
                data(j, 1) = Temp1
                Temp0 = data(i, 0)
                data(i, 0) = data(j, 0)
                data(j, 0) = Temp0
                Temp5 = data(i, 5)
                data(i, 5) = data(j, 5)
                data(j, 5) = Temp5
            End If
   Next j
Next i
Plybooks.ListBox1.List = data

将列表加载到数组中,对其排序,然后将其放回。:)恐怕我们已经进入了一个循环Rory!一点线索也没有,想看看你帮我做的最后一件。。。我会看看我是否能提出一些建议,但再一次-任何非常感谢的帮助,可能需要我一段时间!将列表加载到数组中,对其排序,然后将其放回。:)恐怕我们已经进入了一个循环Rory!一点线索也没有,想看看你帮我做的最后一件。。。我会看看我是否能提出一些建议,但再一次-任何非常感谢的帮助,可能需要我一段时间!由于Hi@Rory的原因,排序未按预期工作,应该是最低的。底部为非数字。我已经添加了一个例子,说明我现在得到的是什么,因为Hi@Rory,sort没有按预期工作,应该是最低的。底部为非数字。我已经添加了一个我现在得到的例子