冒泡排序
排序过程如下
例1:未排序数据——9;3;5;7;0;5
第一次排序——3;5;7;0;5;9(9比任何其它数都大,排到最后)
第二次排序——3;5;0;5;7;9(接下来7向后排)
第三次排序——3;0;5;5;7;9(5向后排)
第四次排序——0;3;5;5;7;9(3向后排)
例2:未排序数据——0;2;5;1;6;9
第一次排序——0;2;1;5;6;9(5比大,排到1的后面)
第二次排序——0;1;2;5;6;9(接下来2向后排,到此为止)
第三次排序——0;1;2;5;6;9(没有再发生交换)
Private Sub mpsort(ByRef arr() As Long) '冒泡排序
Dim i AsLong, j As Long, m As Long, tmp As Long
m = UBound(arr) 'm等于数组上标
Do While m'至m等于数组下标
j = m - 1
m = 0
Fori = 0 To j
If arr(i) > arr(i + 1) Then '找到后者大于前者的数
tmp = arr(i):arr(i) = arr(i + 1):arr(i + 1) = tmp
m= i '从该位置开始继续查找
EndIf
Nexti
Loop
End Sub
--------------------------------------
快速排序
排序过程如下
例1:未排序数据——9;3;5;7;0;5
第一次排序——5;3;5;7;0;9
第二次排序——5;3;5;7;0;9
第三次排序——5;3;0;7;5;9
第四次排序——0;3;5;7;5;9
第五次排序——0;3;5;7;5;9
第六次排序——0;3;5;7;5;9
第七次排序——0;3;5;5;7;9
第八次排序——0;3;5;5;7;9
例2:未排序数字——0;2;5;1;6;9
第一次排序——0;2;1;5;6;9
第二次排序——0;1;2;5;6;9
第三次排序——0;1;2;5;6;9
第四次排序——0;1;2;5;6;9
Private Sub QuickSort(ByRef arr() As Long,lngL As Long,lngR As Long) '快速排序
'lngL,lngR是排序数组的下标,上标
Dim i AsLong, j As Long, M As Long, tmp As Long
i =lngL
j =lngR
M = arr((i +j) \ 2)
tmp =tCenter(arr(i), M, arr(j))'取轴枢,既作为比较的那个数
While i <j
Whilei < lngR And arr(i) < tmp '求lngI使N(i)小于轴枢
i= i + 1
Wend
Whilej > lngL And arr(j) > tmp '求lngJ使N(j)大于轴枢
j= j - 1
Wend
If i <= j Then '不出错,交换N(i)和N(j)
M = arr(i) : arr(i) = arr(j) : arr(j) = M
i = i + 1 : j = j - 1
End If
Wend
If lngL <j Then: Call QuickSort(arr,lngL, j) '改变位置,递归调用
If i <lngR Then: Call QuickSort(arr,i, lngR)
End Sub
---------------
Private Function tCenter(a As Long, b As Long, c As Long)As Long '取三者中的中间项
If (a >=b And b >= c) Or (c >= b And b >= a) Then tCenter =b
If (a >=c And c >= b) Or (b >= c And c >= a) Then tCenter =c
If (b >=a And a >= c) Or (c >= a And a >= b) Then tCenter =a
End Function
--------------------------------------
插入排序
排序过程如下
例1:未排序数据——9;3;5;7;0;5
第一次排序——0;3;9;5;7;5
第二次排序——0;3;9;5;7;5
第三次排序——0;3;5;9;7;5
第四次排序——0;3;5;5;7;9
第五次排序——0;3;5;5;7;9
第六次排序——0;3;5;5;7;9
例2:未排序数据——0;2;5;1;6;9
第一次排序——0;1;2;5;6;9
第二次排序——0;1;2;5;6;9
第三次排序——0;1;2;5;6;9
第四次排序——0;1;2;5;6;9
第五次排序——0;1;2;5;6;9
第六次排序——0;1;2;5;6;9
Private Sub insort(ByRef arr() As Long) '插入排序
Dim i AsLong, j As Long, k As Long, M As Long, tmp As Long
M =UBound(arr)
For i = 0 ToM'从数组下标到数组上标
For j = i + 1 To M'从数组的后一位开始
If arr(j) < arr(i) Then'后者小于前者
tmp = arr(j)
Fork = j To i + 1 Step -1'往后移动数组
arr(k) = arr(k - 1)
Nextk
arr(i)= tmp'插入该数
EndIf
Next j
Next i
End Sub
--------------------------------------
选择排序
排序过程如下
例1:未排序数据——9;3;5;7;0;5
第一次排序——0;3;5;7;9;5
第二次排序——0;3;5;7;9;5
第三次排序——0;3;5;7;9;5
第四次排序——0;3;5;5;9;7
第五次排序——0;3;5;5;7;9
第六次排序——0;3;5;5;7;9
例2:未排序数据——0;2;5;1;6;9
第一次排序——0;2;5;1;6;9
第二次排序——0;1;5;2;6;9
第三次排序——0;1;2;5;6;9
第四次排序——0;1;2;5;6;9
第五次排序——0;1;2;5;6;9
第六次排序——0;1;2;5;6;9
Private Sub selctsort(ByRef arr() As Long) '选择排序
Dim i AsLong, j As Long, M As Long, k As Long, tmp As Long
M =UBound(arr)
For i = 0 ToM '从数组下标开始到数组上标
k = i
Forj = i + 1 To M '从后一位开始比较
Ifarr(j) < arr(k) Then: k = j '挑出最小的数字
Nextj
tmp = arr(i) '交换位置
arr(i) = arr(k) : arr(k) = tmp
Next i
End Sub
|