標題:
[原創]
快速插入排序
[打印本頁]
作者:
linyancheng
時間:
2017-2-19 19:44
標題:
快速插入排序
排序陣列:10000 x 2 的整數(但我的引數代碼是Variant)
(重複數字大概在5~20個之間)
執行100次秒數總合:
一維重複順序(非穩) 3.296
一維重複逆序(非穩) 3.641
一維重複亂序(非穩) 5.499
一維不重複順序(非穩) 2.814
一維不重複逆序(非穩) 3.166
一維不重複亂序(非穩) 6.153
一維重複順序(穩定) 4.687
一維重複逆序(穩定) 4.876
一維重複亂序(穩定) 5.479
一維不重複順序(穩定) 6.56
一維不重複逆序(穩定) 8.148
一維不重複亂序(穩定) 9.1
二維重複順序(穩定) 5.176
二維重複逆序(穩定) 5.517
二維重複亂序(穩定) 5.89
二維不重複順序(穩定) 7.598
二維不重複逆序(穩定) 9.238
二維不重複亂序(穩定) 9.462
Option Explicit
Option Base 1
Option Compare Text
Public Sub S_一維陣列快速插入排序_01(ByRef 原始一維陣列 As Variant, ByVal 起限 As Long, ByVal 迄限 As Long, ByVal 遞增或遞減 As String)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Select Case 遞增或遞減
Case "遞增"
一維陣列快速插入遞增排序 原始一維陣列, 起限, 迄限
Case "遞減"
一維陣列快速插入遞減排序 原始一維陣列, 起限, 迄限
End Select
End Sub
Public Sub 一維陣列快速插入遞增排序(ByRef 原始一維陣列 As Variant, ByVal 起限 As Long, ByVal 迄限 As Long)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Dim X As Long
Dim Y As Long
Dim S As Long
Dim E As Long
Dim 暫存 As Variant
Dim 基準 As Variant
'------------------------------------------------------
If 迄限 - 起限 < 16 Then
For X = 起限 + 1 To 迄限
暫存 = 原始一維陣列(X)
For Y = X - 1 To 起限 Step -1
If 暫存 >= 原始一維陣列(Y) Then
Exit For
End If
原始一維陣列(Y + 1) = 原始一維陣列(Y)
Next Y
原始一維陣列(Y + 1) = 暫存
Next X
Else
Dim 基準陣列(3) As Variant
基準陣列(1) = 原始一維陣列(起限)
基準陣列(2) = 原始一維陣列((起限 + 迄限) \ 2)
基準陣列(3) = 原始一維陣列(迄限)
For X = 2 To 3
暫存 = 基準陣列(X)
For Y = X - 1 To 1 Step -1
If 暫存 >= 基準陣列(Y) Then
Exit For
End If
基準陣列(Y + 1) = 基準陣列(Y)
Next Y
基準陣列(Y + 1) = 暫存
Next X
基準 = 基準陣列(2)
'------------------------------------------------------
S = 起限 - 1
E = 迄限 + 1
Do
Do
S = S + 1
If 原始一維陣列(S) >= 基準 Then
Exit Do
End If
Loop
Do
E = E - 1
If 原始一維陣列(E) <= 基準 Then
Exit Do
End If
Loop
If E <= S Then
Exit Do
End If
暫存 = 原始一維陣列(S)
原始一維陣列(S) = 原始一維陣列(E)
原始一維陣列(E) = 暫存
Loop
'------------------------------------------------------
If 起限 < E And E < 迄限 Then
一維陣列快速插入遞增排序 原始一維陣列, 起限, E
End If
If 起限 < S And S < 迄限 Then
一維陣列快速插入遞增排序 原始一維陣列, S, 迄限
End If
End If
End Sub
Public Sub 一維陣列快速插入遞減排序(ByRef 原始一維陣列 As Variant, ByVal 起限 As Long, ByVal 迄限 As Long)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Dim X As Long
Dim Y As Long
Dim S As Long
Dim E As Long
Dim 暫存 As Variant
Dim 基準 As Variant
'------------------------------------------------------
If 迄限 - 起限 < 16 Then
For X = 起限 + 1 To 迄限
暫存 = 原始一維陣列(X)
For Y = X - 1 To 起限 Step -1
If 暫存 <= 原始一維陣列(Y) Then
Exit For
End If
原始一維陣列(Y + 1) = 原始一維陣列(Y)
Next Y
原始一維陣列(Y + 1) = 暫存
Next X
Else
Dim 基準陣列(3) As Variant
基準陣列(1) = 原始一維陣列(起限)
基準陣列(2) = 原始一維陣列((起限 + 迄限) \ 2)
基準陣列(3) = 原始一維陣列(迄限)
For X = 2 To 3
暫存 = 基準陣列(X)
For Y = X - 1 To 1 Step -1
If 暫存 >= 基準陣列(Y) Then
Exit For
End If
基準陣列(Y + 1) = 基準陣列(Y)
Next Y
基準陣列(Y + 1) = 暫存
Next X
基準 = 基準陣列(2)
'------------------------------------------------------
S = 起限 - 1
E = 迄限 + 1
Do
Do
S = S + 1
If 原始一維陣列(S) <= 基準 Then
Exit Do
End If
Loop
Do
E = E - 1
If 原始一維陣列(E) >= 基準 Then
Exit Do
End If
Loop
If E <= S Then
Exit Do
End If
暫存 = 原始一維陣列(S)
原始一維陣列(S) = 原始一維陣列(E)
原始一維陣列(E) = 暫存
Loop
'------------------------------------------------------
If 起限 < E And E < 迄限 Then
一維陣列快速插入遞減排序 原始一維陣列, 起限, E
End If
If 起限 < S And S < 迄限 Then
一維陣列快速插入遞減排序 原始一維陣列, S, 迄限
End If
End If
End Sub
複製代碼
作者:
linyancheng
時間:
2017-2-19 19:51
Option Explicit
Option Base 1
Option Compare Text
Public Sub S_一維陣列快速插入穩定排序_01(ByRef 原始一維陣列 As Variant, ByVal 起限 As Long, ByVal 迄限 As Long, ByVal 遞增或遞減 As String)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Dim X As Long
Dim 索引陣列() As Long
'------------------------------------------------------
ReDim 索引陣列(起限 To 迄限) As Long
For X = 起限 To 迄限
索引陣列(X) = X
Next X
'------------------------------------------------------
Select Case 遞增或遞減
Case "遞增"
一維陣列快速插入穩定遞增排序 原始一維陣列, 索引陣列, 起限, 迄限
Case "遞減"
一維陣列快速插入穩定遞減排序 原始一維陣列, 索引陣列, 起限, 迄限
End Select
'------------------------------------------------------
Dim 複製原始一維陣列 As Variant
複製原始一維陣列 = 原始一維陣列
For X = 起限 To 迄限
原始一維陣列(X) = 複製原始一維陣列(索引陣列(X))
Next X
End Sub
Public Sub S_二維陣列快速插入穩定排序_01(ByRef 原始二維陣列 As Variant, ByVal 排序維度 As Long, ByVal 排序鍵值 As Long, ByVal 起限 As Long, ByVal 迄限 As Long, ByVal 遞增或遞減 As String)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Dim X As Long
Dim Y As Long
Dim 擷取成一維陣列 As Variant
Dim 索引陣列() As Long
'------------------------------------------------------
ReDim 擷取成一維陣列(起限 To 迄限) As Variant
ReDim 索引陣列(起限 To 迄限) As Long
If 排序維度 = 1 Then
For X = 起限 To 迄限
擷取成一維陣列(X) = 原始二維陣列(X, 排序鍵值)
索引陣列(X) = X
Next X
Else
For Y = 起限 To 迄限
擷取成一維陣列(Y) = 原始二維陣列(排序鍵值, Y)
索引陣列(Y) = Y
Next Y
End If
'------------------------------------------------------
Select Case 遞增或遞減
Case "遞增"
一維陣列快速插入穩定遞增排序 擷取成一維陣列, 索引陣列, 起限, 迄限
Case "遞減"
一維陣列快速插入穩定遞減排序 擷取成一維陣列, 索引陣列, 起限, 迄限
End Select
'------------------------------------------------------
Dim 複製原始二維陣列 As Variant
複製原始二維陣列 = 原始二維陣列
If 排序維度 = 1 Then
For X = 起限 To 迄限
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
原始二維陣列(X, Y) = 複製原始二維陣列(索引陣列(X), Y)
Next Y
Next X
Else
For Y = 起限 To 迄限
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
原始二維陣列(X, Y) = 複製原始二維陣列(X, 索引陣列(Y))
Next X
Next Y
End If
End Sub
複製代碼
作者:
linyancheng
時間:
2017-2-19 19:51
Public Sub 一維陣列快速插入穩定遞增排序(ByRef 原始一維陣列 As Variant, ByRef 索引陣列() As Long, ByVal 起限 As Long, ByVal 迄限 As Long)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Dim X As Long
Dim Y As Long
Dim S As Long
Dim M As Long
Dim E As Long
Dim N As Long
Dim 暫存 As Variant
Dim 索引暫存 As Long
'------------------------------------------------------
If 迄限 - 起限 < 16 Then
Dim 還原陣列 As Variant
ReDim 還原陣列(起限 To 迄限) As Variant
For X = 起限 To 迄限
還原陣列(X) = 原始一維陣列(索引陣列(X))
Next X
For X = 起限 + 1 To 迄限
暫存 = 還原陣列(X)
索引暫存 = 索引陣列(X)
For Y = X - 1 To 起限 Step -1
If 暫存 >= 還原陣列(Y) Then
Exit For
End If
還原陣列(Y + 1) = 還原陣列(Y)
索引陣列(Y + 1) = 索引陣列(Y)
Next Y
還原陣列(Y + 1) = 暫存
索引陣列(Y + 1) = 索引暫存
Next X
Else
Dim 基準 As Variant
Dim 基準陣列(3) As Variant
基準陣列(1) = 原始一維陣列(索引陣列(起限))
基準陣列(2) = 原始一維陣列(索引陣列((起限 + 迄限) \ 2))
基準陣列(3) = 原始一維陣列(索引陣列(迄限))
For X = 2 To 3
暫存 = 基準陣列(X)
For Y = X - 1 To 1 Step -1
If 暫存 >= 基準陣列(Y) Then
Exit For
End If
基準陣列(Y + 1) = 基準陣列(Y)
Next Y
基準陣列(Y + 1) = 暫存
Next X
基準 = 基準陣列(2)
'------------------------------------------------------
Dim 索引起陣列() As Long
Dim 索引基陣列() As Long
Dim 索引迄陣列() As Long
ReDim 索引起陣列(迄限 - 起限) As Long
ReDim 索引基陣列(迄限 - 起限 + 1) As Long
ReDim 索引迄陣列(迄限 - 起限) As Long
S = 0
M = 0
E = 0
For X = 起限 To 迄限
索引暫存 = 索引陣列(X)
暫存 = 原始一維陣列(索引暫存)
If 暫存 = 基準 Then
M = M + 1
索引基陣列(M) = 索引暫存
ElseIf 暫存 < 基準 Then
S = S + 1
索引起陣列(S) = 索引暫存
Else
E = E + 1
索引迄陣列(E) = 索引暫存
End If
Next X
'------------------------------------------------------
If S > 1 Then
一維陣列快速插入穩定遞增排序 原始一維陣列, 索引起陣列, 1, S
End If
If E > 1 Then
一維陣列快速插入穩定遞增排序 原始一維陣列, 索引迄陣列, 1, E
End If
'------------------------------------------------------
N = 起限 - 1
For X = 1 To S
N = N + 1
索引陣列(N) = 索引起陣列(X)
Next X
For X = 1 To M
N = N + 1
索引陣列(N) = 索引基陣列(X)
Next X
For X = 1 To E
N = N + 1
索引陣列(N) = 索引迄陣列(X)
Next X
End If
End Sub
Public Sub 一維陣列快速插入穩定遞減排序(ByRef 原始一維陣列 As Variant, ByRef 索引陣列() As Long, ByVal 起限 As Long, ByVal 迄限 As Long)
On Error Resume Next
If 起限 >= 迄限 Then
Exit Sub
End If
'------------------------------------------------------
Dim X As Long
Dim Y As Long
Dim S As Long
Dim M As Long
Dim E As Long
Dim N As Long
Dim 暫存 As Variant
Dim 索引暫存 As Long
'------------------------------------------------------
If 迄限 - 起限 < 16 Then
Dim 還原陣列 As Variant
ReDim 還原陣列(起限 To 迄限) As Variant
For X = 起限 To 迄限
還原陣列(X) = 原始一維陣列(索引陣列(X))
Next X
For X = 起限 + 1 To 迄限
暫存 = 還原陣列(X)
索引暫存 = 索引陣列(X)
For Y = X - 1 To 起限 Step -1
If 暫存 <= 還原陣列(Y) Then
Exit For
End If
還原陣列(Y + 1) = 還原陣列(Y)
索引陣列(Y + 1) = 索引陣列(Y)
Next Y
還原陣列(Y + 1) = 暫存
索引陣列(Y + 1) = 索引暫存
Next X
Else
Dim 基準 As Variant
Dim 基準陣列(3) As Variant
基準陣列(1) = 原始一維陣列(索引陣列(起限))
基準陣列(2) = 原始一維陣列(索引陣列((起限 + 迄限) \ 2))
基準陣列(3) = 原始一維陣列(索引陣列(迄限))
For X = 2 To 3
暫存 = 基準陣列(X)
For Y = X - 1 To 1 Step -1
If 暫存 >= 基準陣列(Y) Then
Exit For
End If
基準陣列(Y + 1) = 基準陣列(Y)
Next Y
基準陣列(Y + 1) = 暫存
Next X
基準 = 基準陣列(2)
'------------------------------------------------------
Dim 索引起陣列() As Long
Dim 索引基陣列() As Long
Dim 索引迄陣列() As Long
ReDim 索引起陣列(迄限 - 起限) As Long
ReDim 索引基陣列(迄限 - 起限 + 1) As Long
ReDim 索引迄陣列(迄限 - 起限) As Long
S = 0
M = 0
E = 0
For X = 起限 To 迄限
索引暫存 = 索引陣列(X)
暫存 = 原始一維陣列(索引暫存)
If 暫存 = 基準 Then
M = M + 1
索引基陣列(M) = 索引暫存
ElseIf 暫存 > 基準 Then
S = S + 1
索引起陣列(S) = 索引暫存
Else
E = E + 1
索引迄陣列(E) = 索引暫存
End If
Next X
'------------------------------------------------------
If S > 1 Then
一維陣列快速插入穩定遞減排序 原始一維陣列, 索引起陣列, 1, S
End If
If E > 1 Then
一維陣列快速插入穩定遞減排序 原始一維陣列, 索引迄陣列, 1, E
End If
'------------------------------------------------------
N = 起限 - 1
For X = 1 To S
N = N + 1
索引陣列(N) = 索引起陣列(X)
Next X
For X = 1 To M
N = N + 1
索引陣列(N) = 索引基陣列(X)
Next X
For X = 1 To E
N = N + 1
索引陣列(N) = 索引迄陣列(X)
Next X
End If
End Sub
複製代碼
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)