|
本帖最后由 cidanji 于 2023-11-22 09:33 编辑
归并排序还是挺好的,在vba里写了一下,10万的乱序数组排下来速度还可以,略逊于快速排序 但特点是它本身类属稳定排序 相同值顺序不乱
- '/// 归并排序 ///
- '【说明】速度快,略逊于快速排序,但属稳定排序。不限数据类型支持数字/字符串/日期等
- '【参数】arr:要排序的数组,x:排序开始行,UD:0升降(默认)1降序
- Sub GBsort(arr, x&, Optional UD&)
- Dim brr(), y&
- y = UBound(arr)
- ReDim brr(x To y)
- toSort arr, brr, x, y
- If UD <> 0 Then
- Dim i&, j&, crr
- ReDim crr(LBound(arr) To UBound(arr))
- For i = LBound(arr) To UBound(arr)
- If i < x Or i > y Then
- crr(i) = arr(i)
- Else
- crr(i) = arr(y + x - i)
- End If
- Next
- arr = crr
- End If
- End Sub
- Private Sub toSort(a, b, x&, y&)
- If y <= x Then Exit Sub
- Dim m&
- m = Int((y + x) / 2)
- toSort a, b, x, m
- toSort a, b, m + 1, y
- merger a, b, x, m, y
- End Sub
- Private Sub merger(a, b, x&, m&, y&)
- Dim i As Long
- Dim j As Long
- Dim k As Long
- i = x
- j = m + 1
- For k = x To y
- b(k) = a(k)
- b(k) = a(k)
- Next
- For k = x To y
- If i > m Then
- a(k) = b(j)
- j = j + 1
- ElseIf j > y Then
- a(k) = b(i)
- i = i + 1
- ElseIf b(i) <= b(j) Then
- a(k) = b(i)
- i = i + 1
- Else
- a(k) = b(j)
- j = j + 1
- End If
- Next
- End Sub
复制代码
|
评分
-
3
查看全部评分
-
|