Excel Excal Listbox冒泡排序在大量数据上运行缓慢
我使用以下代码对多列列表框中的数据进行排序。它根据第5列中的数字数据进行排序。它工作得很好,但当列表框中有大量数据时,速度非常慢 有没有更快的解决方案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
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;j您的气泡不正确。下面是一般的冒泡排序。此外,冒泡排序在处理大量数据时固有的速度较慢
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;j与其他排序算法相比,冒泡排序速度较慢。请参见上的时间复杂度比较 您可以使用预定义的方法对整个列表进行排序:
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没有按预期工作,应该是最低的。底部为非数字。我已经添加了一个我现在得到的例子