vb 排序程序1.docx
《vb 排序程序1.docx》由会员分享,可在线阅读,更多相关《vb 排序程序1.docx(12页珍藏版)》请在冰豆网上搜索。
vb排序程序1
OptionExplicit
DimSums(9999)AsLong,Sumb(9999)AsLong '生成数据数量可自己设置
PrivateblnSort AsBoolean '排序方向
PrivateDeclareFunctionSendMessageFindLib"User32"Alias"SendMessageA"(ByValhWndAsLong,ByValwmsgAsLong,ByValwparamAsInteger,ByVallparamAsString)AsLong
PrivateDeclareFunctiontimeGetTimeLib"winmm.dll"()AsLong
DimT AsLong
PrivateSubCommand1_Click()
DimiAsLong,zAsLong,jAsLong
List1.Clear
DoEvents
List1.Visible=False
Fori=0ToUBound(Sums)
nn:
Randomize
z=99999*Rnd+9
j=SendMessageFind(List1.hWnd,&H18F,0,z)
Ifj>-1Then
GoTonn
Else
Sums(i)=z
Sumb(i)=z
List1.AddItemSums(i)
EndIf
Next
List1.Visible=True
Me.Caption="共产生数据:
"&UBound(Sums)+1&"项"
EndSub
PrivateSubCommand2_Click()
DimtiAsInteger,iAsLong
List2.Clear
DoEvents
Fori=0ToUBound(Sumb)
Sums(i)=Sumb(i)
Next
blnSort=Option1(0).Value
T=timeGetTime
IfOption2(0).Value=TrueThen
Callmpsort(Sums) '冒泡排序
ti=0
EndIf
IfOption2
(1).Value=TrueThen
Callinsort(Sums) '插入排序
ti=1
EndIf
IfOption2
(2).Value=TrueThen
CallQuickSort(LBound(Sums),UBound(Sums)) '快速排序
ti=2
EndIf
IfOption2(3).Value=TrueThen
Callselctsort(Sums) '选择排序
ti=3
EndIf
IfOption2(4).Value=TrueThen
Callhirsort(Sums) '希尔排序
ti=4
EndIf
IfOption2(5).Value=TrueThen
Callduisort(Sums) '堆排序
ti=5
EndIf
IfOption2(6).Value=TrueThen
Callnsort(Sums) '打乱次序
ti=6
EndIf
Label1(ti).Caption=timeGetTime-T
List2.Visible=False
DoEvents
Fori=0ToUBound(Sums)
List2.AddItemSums(i)
Next
List2.Visible=True
Me.Caption="成功对:
"&UBound(Sums)+1&"项数据进行了排序,用时:
"&Label1(ti).Caption&"毫秒"
ExitSub
EndSub
PrivateSubCommand3_Click()
List1.Clear
List2.Clear
Me.Caption="六种排序"
EndSub
PrivateSubnsort(ByRefarrtosort()AsLong)
DimiAsLong,jAsLong,tmpAsLong
Fori=LBound(arrtosort)ToUBound(arrtosort)
j=(UBound(arrtosort)-i)*Rnd+i
Ifi<>jThen
tmp=arrtosort(i)
arrtosort(i)=arrtosort(j)
arrtosort(j)=tmp
EndIf
Nexti
EndSub
PrivateSubmpsort(ByRefarrtosort()AsLong) '冒泡排序
'经过n-1趟子排序完成的,它的时间复杂度为O(n^2)
'优点:
1.“编程复杂度”很低,很容易写出代码;2.具有稳定性
DimiAsLong,jAsLong,MAsLong,tmpAsLong
M=UBound(arrtosort) 'm等于数组上标
DoWhileM '至m等于数组下标
j=M-1
M=0
IfblnSortThen
Fori=0Toj
Ifarrtosort(i)>arrtosort(i+1)Then '找到后者大于前者地数
tmp=arrtosort(i) '两者互换
arrtosort(i)=arrtosort(i+1)
arrtosort(i+1)=tmp
M=i '从该位置开始继续查找
EndIf
Nexti
Else
Fori=0Toj
Ifarrtosort(i) tmp=arrtosort(i)
arrtosort(i)=arrtosort(i+1)
arrtosort(i+1)=tmp
M=i
EndIf
Nexti
EndIf
Loop
EndSub
PrivateSubinsort(ByRefarrtosort()AsLong) '插入排序
'插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据
'算法适用于少量数据的排序,时间复杂度为O(n^2)。
是稳定的排序方法。
DimiAsLong,jAsLong,kAsLong,MAsLong,tmpAsLong
M=UBound(arrtosort)
Fori=0ToM '从数组下标到数组上标
IfblnSortThen
Forj=i+1ToM '从数组的后一位开始
Ifarrtosort(j) tmp=arrtosort(j)
Fork=jToi+1Step-1 '往后移动数组
arrtosort(k)=arrtosort(k-1)
Nextk
arrtosort(i)=tmp '插入该数
EndIf
Nextj
Else
Forj=i+1ToM
Ifarrtosort(j)>arrtosort(i)Then
tmp=arrtosort(j)
Fork=jToi+1Step-1
arrtosort(k)=arrtosort(k-1)
Nextk
arrtosort(i)=tmp
EndIf
Nextj
EndIf
Nexti
EndSub
PrivateSubQuickSort(lngLAsLong,lngRAsLong) '快速排序,lngL,lngR 需排序数组的下标,上标
'快速排序(Quicksort)是对冒泡排序的一种改进。
由C.A.R.Hoare在1962年提出。
'它的基本思想是:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小
'然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
DimiAsLong,jAsLong,MAsLong,tmpAsLong
i=lngL
j=lngR
M=Sums((i+j)\2)
tmp=tCenter(Sums(i),M,Sums(j)) '取轴枢,既作为比较的那个数
Whilei IfblnSortThen
Whilei i=i+1
Wend
Whilej>lngLAndSums(j)>tmp '求lngJ使N(j)大于轴枢
j=j-1
Wend
Else
Whileitmp
i=i+1
Wend
Whilej>lngLAndSums(j) j=j-1
Wend
EndIf
Ifi<=jThen '不出错,交换N(i)和N(j)
M=Sums(i)
Sums(i)=Sums(j)
Sums(j)=M
i=i+1
j=j-1
EndIf
Wend
IflngLCallQuickSort(lngL,j) '改变位置,递归调用
IfiCallQuickSort(i,lngR)
EndSub
PrivateFunctiontCenter(aAsLong,bAsLong,CAsLong)AsLong '取三者中的中间项
Ifa>bThen 'a>b
Ifb>CThen 'a>b>c
tCenter=b 'b
Else 'a>bc>=b
Ifa>CThen 'a>bc>=ba>c
tCenter=C 'c
Else 'a>bc>=bc>a
tCenter=a 'a
EndIf
EndIf
Else 'b>=a
Ifa>CThen 'b>=aa>c
tCenter=a 'a
Else 'b>=ac>=a
Ifb>CThen 'b>=ac>=ab>c
tCenter=C 'c
Else 'b>=a c>=ac>=b
tCenter=b 'b
EndIf
EndIf
EndIf
EndFunction
PrivateSubselctsort(ByRefarrtosort()AsLong) '选择排序
'每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,
'直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。
DimiAsLong,jAsLong,MAsLong,kAsLong,tmpAsLong
M=UBound(arrtosort)
Fori=0ToM '从数组下标开始到数组上标
k=i
IfblnSortThen
Forj=i+1ToM '从后一位开始比较
Ifarrtosort(j)k=j '挑出最小的数字
Nextj
Else
Forj=i+1ToM
Ifarrtosort(j)>arrtosort(k)Then:
k=j