VBA排序的十种算法.doc

上传人:scccc 文档编号:12148039 上传时间:2021-12-02 格式:DOC 页数:22 大小:657KB
返回 下载 相关 举报
VBA排序的十种算法.doc_第1页
第1页 / 共22页
VBA排序的十种算法.doc_第2页
第2页 / 共22页
VBA排序的十种算法.doc_第3页
第3页 / 共22页
VBA排序的十种算法.doc_第4页
第4页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《VBA排序的十种算法.doc》由会员分享,可在线阅读,更多相关《VBA排序的十种算法.doc(22页珍藏版)》请在三一文库上搜索。

1、在使用 VBA进行写程序时,经常会做排序,下面将会给出一些常用的排序算法的实现,方便大家写程序参考, 若代码中出现了错误, 欢迎高手指正。主要算法有:1、 ( 冒 泡 排 序 ) B u b b le s o rt2、(选择排序)Sel e c t io n s o r t3、(插入排序)Ins e r t io n s o r t4、(快速排序)Q uickso rt5、(合并排序)M e rges o rt6、 (堆排序)H eapsort7、 ( 组 合 排 序 ) C o m b S o rt8、(希尔排序)S hellS o rt9、(基数排序)R a dixS o rt10、Sha

2、kerSort第一种(冒泡排序)BubblesortPublicSubBubbleSort(ByReflngArray()AsLong)DimiOuterAsLongDimiInnerAsLongDimiLBoundAsLongDimiUBoundAsLongDimiTempAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)' 冒泡排序ForiOuter=iLBoundToiUBound-1ForiInner=iLBoundToiUBound-iOuter-1' 比较相邻项IflngArray(iInner)>ln

3、gArray(iInner+1)Then' 交换值iTemp=lngArray(iInner)lngArray(iInner)=lngArray(iInner+1)lngArray(iInner+1)=iTempEndIfNextiInnerNextiOuterEndSub2、(选择排序)Selectionsort1. PublicSubSelectionSort(ByReflngArray()AsLong)2. DimiOuterAsLong3. DimiInnerAsLong4. DimiLBoundAsLong5. DimiUBoundAsLong6. DimiTempAsLon

4、g7. DimiMaxAsLong8. iLBound=LBound(lngArray)9. iUBound=UBound(lngArray)10. ' 选择排序11. ForiOuter=iUBoundToiLBound+1Step-112. iMax=013. ' 得到最大值得索引14. ForiInner=iLBoundToiOuter15. IflngArray(iInner)>lngArray(iMax)TheniMax=iInner16. NextiInner17. ' 值交换18. iTemp=lngArray(iMax)19. lngArray(i

5、Max)=lngArray(iOuter)20. lngArray(iOuter)=iTemp21. NextiOuter22. EndSub复制代码第三种(插入排序)Insertionsort1. PublicSubInsertionSort(ByReflngArray()AsLong)2. DimiOuterAsLong3. DimiInnerAsLong4. DimiLBoundAsLong5. DimiUBoundAsLong6. DimiTempAsLong7. iLBound=LBound(lngArray)8. iUBound=UBound(lngArray)9. ForiOut

6、er=iLBound+1ToiUBound10. ' 取得插入值11. iTemp=lngArray(iOuter)12. ' 移动已经排序的值13. ForiInner=iOuter-1ToiLBoundStep-114. IflngArray(iInner)<=iTempThenExitFor15. lngArray(iInner+1)=lngArray(iInner)16. NextiInner17. ' 插入值18. lngArray(iInner+1)=iTemp19. NextiOuter20. EndSub复制代码第四种(快速排序)Quicksort

7、1. PublicSubQuickSort(ByReflngArray()AsLong)2. DimiLBoundAsLong3. DimiUBoundAsLong4. DimiTempAsLong5. DimiOuterAsLong6. DimiMaxAsLong7. iLBound=LBound(lngArray)8. iUBound=UBound(lngArray)9. ' 若只有一个值,不排序10. If(iUBound-iLBound)Then11. ForiOuter=iLBoundToiUBound12. IflngArray(iOuter)>lngArray(iM

8、ax)TheniMax=iOuter13. NextiOuter14. iTemp=lngArray(iMax)15. lngArray(iMax)=lngArray(iUBound)16. lngArray(iUBound)=iTemp17. ' 开始快速排序18. InnerQuickSortlngArray,iLBound,iUBound19. EndIf20. EndSub21. PrivateSubInnerQuickSort(ByReflngArray()AsLong,ByValiLeftEndAsLong,ByValiRightEndAsLong)22. DimiLeft

9、CurAsLong23. DimiRightCurAsLong24. DimiPivotAsLong25. DimiTempAsLong26. IfiLeftEnd>=iRightEndThenExitSub27. iLeftCur=iLeftEnd28. iRightCur=iRightEnd+129. iPivot=lngArray(iLeftEnd)30. Do31. Do32. iLeftCur=iLeftCur+133. LoopWhilelngArray(iLeftCur)<iPivot34. Do35. iRightCur=iRightCur-136. LoopWhi

10、lelngArray(iRightCur)>iPivot37. IfiLeftCur>=iRightCurThenExitDo38. ' 交换值39. iTemp=lngArray(iLeftCur)40. lngArray(iLeftCur)=lngArray(iRightCur)41. lngArray(iRightCur)=iTemp42. Loop43. ' 递归快速排序44. lngArray(iLeftEnd)=lngArray(iRightCur)45. lngArray(iRightCur)=iPivot46. InnerQuickSortlngAr

11、ray,iLeftEnd,iRightCur-147. InnerQuickSortlngArray,iRightCur+1,iRightEnd48. EndSub复制代码第五种(合并排序)Mergesort1. PublicSubMergeSort(ByReflngArray()AsLong)2. DimarrTemp()AsLong3. DimiSegSizeAsLong4. DimiLBoundAsLong5. DimiUBoundAsLong6. iLBound=LBound(lngArray)7. iUBound=UBound(lngArray)8. ReDimarrTemp(iLB

12、oundToiUBound)9. iSegSize=110. DoWhileiSegSize<iUBound-iLBound11. '合并A到B12. InnerMergePasslngArray,arrTemp,iLBound,iUBound,iSegSize13. iSegSize=iSegSize+iSegSize14. '合并B到A15. InnerMergePassarrTemp,lngArray,iLBound,iUBound,iSegSize16. iSegSize=iSegSize+iSegSize17. Loop18. EndSub19. Private

13、SubInnerMergePass(ByReflngSrc()AsLong,ByReflngDest()AsLong,ByValiLBoundAsLong,iUBoundAsLong,ByValiSegSizeAsLong)20. DimiSegNextAsLong21. iSegNext=iLBound22. DoWhileiSegNext<=iUBound-(2*iSegSize)23. ' 合并24. InnerMergelngSrc,lngDest,iSegNext,iSegNext+iSegSize-1,iSeg Next+iSegSize+iSegSize-125.

14、iSegNext=iSegNext+iSegSize+iSegSize26. Loop27. IfiSegNext+iSegSize<=iUBoundThen28. InnerMergelngSrc,lngDest,iSegNext,iSegNext+iSegSize-1,iUBound29. Else30. ForiSegNext=iSegNextToiUBound31. lngDest(iSegNext)=lngSrc(iSegNext)32. NextiSegNext33. EndIf34. EndSub35. PrivateSubInnerMerge(ByReflngSrc()A

15、sLong,ByReflngDest()AsLong,ByValiStartFirstAsLong,ByValiEndFirstAsLong,ByValiEndSecondAsLong)36. DimiFirstAsLong37. DimiSecondAsLong38. DimiResultAsLong39. DimiOuterAsLong40. iFirst=iStartFirst41. iSecond=iEndFirst+142. iResult=iStartFirst43. DoWhile(iFirst<=iEndFirst)And(iSecond<=iEndSecond)4

16、4. IflngSrc(iFirst)<=lngSrc(iSecond)Then45. lngDest(iResult)=lngSrc(iFirst)46. iFirst=iFirst+147. Else48. lngDest(iResult)=lngSrc(iSecond)49. iSecond=iSecond+150. EndIf51. iResult=iResult+152. Loop53. IfiFirst>iEndFirstThen54. ForiOuter=iSecondToiEndSecond55. lngDest(iResult)=lngSrc(iOuter)56.

17、 iResult=iResult+157. NextiOuter58. Else59. ForiOuter=iFirstToiEndFirst60. lngDest(iResult)=lngSrc(iOuter)61. iResult=iResult+162. NextiOuter63. EndIf64. EndSub复制代码第六种(堆排序)Heapsort1. PublicSubHeapSort(ByReflngArray()AsLong)2. DimiLBoundAsLong3. DimiUBoundAsLong4. DimiArrSizeAsLong5. DimiRootAsLong6.

18、 DimiChildAsLong7. DimiElementAsLong8. DimiCurrentAsLong9. DimarrOut()AsLong10. iLBound=LBound(lngArray)11. iUBound=UBound(lngArray)12. iArrSize=iUBound-iLBound13. ReDimarrOut(iLBoundToiUBound)14. 'Initialisetheheap15. 'Moveuptheheapfromthebottom16. ForiRoot=iArrSize2To0Step-117. iElement=ln

19、gArray(iRoot+iLBound)18. iChild=iRoot+iRoot19. 'Movedowntheheapfromthecurrentposition20. DoWhileiChild<iArrSize21. IfiChild<iArrSizeThen22. IflngArray(iChild+iLBound)<lngArray(iChild+iLBound+1)Then23. 'Alwayswantlargestchild24. iChild=iChild+125. EndIf26. EndIf27. 'Foundaslot,st

20、oplooking28. IfiElement>=lngArray(iChild+iLBound)ThenExitDo29. lngArray(iChild2)+iLBound)=lngArray(iChild+iLBound)30. iChild=iChild+iChild31. Loop32. 'Movethenode33. lngArray(iChild2)+iLBound)=iElement34. NextiRoot35. 'Readofvaluesonebyone(storeinarraystartingattheend)36. ForiRoot=iUBound

21、ToiLBoundStep-137. 'Readthevalue38. arrOut(iRoot)=lngArray(iLBound)39. 'Getthelastelement40. iElement=lngArray(iArrSize+iLBound)41. iArrSize=iArrSize-142. iCurrent=043. iChild=144. 'Findaplaceforthelastelementtogo45. DoWhileiChild<=iArrSize46. IfiChild<iArrSizeThen47. IflngArray(iC

22、hild+iLBound)<lngArray(iChild+iLBound+1)Then48. 'Alwayswantthelargerchild49. iChild=iChild+150. EndIf51. EndIf52. 'Foundaposition53. IfiElement>=lngArray(iChild+iLBound)ThenExitDo54. lngArray(iCurrent+iLBound)=lngArray(iChild+iLBound)55. iCurrent=iChild56. iChild=iChild+iChild57. Loop5

23、8. 'Movethenode59. lngArray(iCurrent+iLBound)=iElement60. NextiRoot61. 'Copyfromtemparraytorealarray62. ForiRoot=iLBoundToiUBound63. lngArray(iRoot)=arrOut(iRoot)64. NextiRoot65. EndSub复制代码第七种(组合排序)CombSort1. PublicSubCombSort(ByReflngArray()AsLong)2. DimiSpacingAsLong3. DimiOuterAsLong4. Di

24、miInnerAsLong5. DimiTempAsLong6. DimiLBoundAsLong7. DimiUBoundAsLong8. DimiArrSizeAsLong9. DimiFinishedAsLong10. iLBound=LBound(lngArray)11. iUBound=UBound(lngArray)12. 'Initialisecombwidth13. iSpacing=iUBound-iLBound14. Do15. IfiSpacing>1Then16. iSpacing=Int(iSpacing/1.3)17. IfiSpacing=0Then

25、18. iSpacing=1'Dontgolowerthan119. ElseIfiSpacing>8AndiSpacing<11Then20. iSpacing=11'Thisisaspecialnumber,goesfasterthan9and1021. EndIf22. EndIf23. 'Alwaysgodownto1beforeattemptingtoexit24. IfiSpacing=1TheniFinished=125. 'Combingpass26. ForiOuter=iLBoundToiUBound-iSpacing27. iI

26、nner=iOuter+iSpacing28. IflngArray(iOuter)>lngArray(iInner)Then29. 'Swap30. iTemp=lngArray(iOuter)31. lngArray(iOuter)=lngArray(iInner)32. lngArray(iInner)=iTemp33. 'Notfinished34. iFinished=035. EndIf36. NextiOuter37. LoopUntiliFinished38. EndSub复制代码第八种(希尔排序)ShellSort1. PublicSubShellSor

27、t(ByReflngArray()AsLong)2. DimiSpacingAsLong3. DimiOuterAsLong4. DimiInnerAsLong5. DimiTempAsLong6. DimiLBoundAsLong7. DimiUBoundAsLong8. DimiArrSizeAsLong9. iLBound=LBound(lngArray)10. iUBound=UBound(lngArray)11. 'Calculateinitialsortspacing12. iArrSize=(iUBound-iLBound)+113. iSpacing=114. IfiA

28、rrSize>13Then15. DoWhileiSpacing<iArrSize16. iSpacing=(3*iSpacing)+117. Loop18. iSpacing=iSpacing919. EndIf20. 'Startsorting21. DoWhileiSpacing22. ForiOuter=iLBound+iSpacingToiUBound23. 'Getthevaluetobeinserted24. iTemp=lngArray(iOuter)25. 'Movealongthealreadysortedvaluesshiftingal

29、ong26. ForiInner=iOuter-iSpacingToiLBoundStep-iSpacing27. 'Nomoreshiftingneeded,wefoundtherightspot!28. IflngArray(iInner)<=iTempThenExitFor29. lngArray(iInner+iSpacing)=lngArray(iInner)30. NextiInner31. 'Insertvalueintheslot32. lngArray(iInner+iSpacing)=iTemp33. NextiOuter34. 'Reduce

30、thesortspacing35. iSpacing=iSpacing336. Loop37. EndSub复制代码第九种(基数排序)RadixSort1. PublicSubRadixSort(ByReflngArray()AsLong)2. DimarrTemp()AsLong3. DimiLBoundAsLong4. DimiUBoundAsLong5. DimiMaxAsLong6. DimiSortsAsLong7. DimiLoopAsLong8. iLBound=LBound(lngArray)9. iUBound=UBound(lngArray)10. 'Creates

31、waparray11. ReDimarrTemp(iLBoundToiUBound)12. iMax=13. 'Findlargest14. ForiLoop=iLBoundToiUBound15. IflngArray(iLoop)>iMaxTheniMax=lngArray(iLoop)16. NextiLoop17. 'Calculatehowmanysortsareneeded18. DoWhileiMax19. iSorts=iSorts+120. iMax=iMax25621. Loop22. iMax=123. 'Dothesorts24. Fori

32、Loop=1ToiSorts25. IfiLoopAnd1Then26. 'Oddsort->srctodest27. InnerRadixSortlngArray,arrTemp,iLBound,iUBound,iMax28. Else29. 'Evensort->desttosrc30. InnerRadixSortarrTemp,lngArray,iLBound,iUBound,iMax31. EndIf32. 'Nextsortfactor33. iMax=iMax*25634. NextiLoop35. 'Ifoddnumberofsort

33、sweneedtoswapthearrays36. If(iSortsAnd1)Then37. ForiLoop=iLBoundToiUBound38. lngArray(iLoop)=arrTemp(iLoop)39. NextiLoop40. EndIf41. EndSub42. PrivateSubInnerRadixSort(ByReflngSrc()AsLong,ByReflngDest()AsLong,ByValiLBoundAsLong,ByValiUBoundAsLong,ByValiDivisorAsLong)43. DimarrCounts(255)AsLong44. Di

34、marrOffsets(255)AsLong45. DimiBucketAsLong46. DimiLoopAsLong47. 'Counttheitemsforeachbucket48. ForiLoop=iLBoundToiUBound49. iBucket=(lngSrc(iLoop)iDivisor)And25550. arrCounts(iBucket)=arrCounts(iBucket)+151. NextiLoop52. 'Generateoffsets53. ForiLoop=1To25554. arrOffsets(iLoop)=arrOffsets(iLo

35、op-1)+arrCounts(iLoop-1)+i LBound55. NextiLoop56. 'Fillthebuckets57. ForiLoop=iLBoundToiUBound58. iBucket=(lngSrc(iLoop)iDivisor)And25559. lngDest(arrOffsets(iBucket)=lngSrc(iLoop)60. arrOffsets(iBucket)=arrOffsets(iBucket)+161. NextiLoop62. EndSub复制代码第十种 ShakerSort1. PublicSubShakerSort(ByRefln

36、gArray()AsLong)2. DimiLowerAsLong3. DimiUpperAsLong4. DimiInnerAsLong5. DimiLBoundAsLong6. DimiUBoundAsLong7. DimiTempAsLong8. DimiMaxAsLong9. DimiMinAsLong10. iLBound=LBound(lngArray)11. iUBound=UBound(lngArray)12. iLower=iLBound-113. iUpper=iUBound+114. DoWhileiLower<iUpper15. iLower=iLower+116

37、. iUpper=iUpper-117. iMax=iLower18. iMin=iLower19. 'Findthelargestandsmallestvaluesinthesubarray20. ForiInner=iLowerToiUpper21. IflngArray(iInner)>lngArray(iMax)Then22. iMax=iInner23. ElseIflngArray(iInner)<lngArray(iMin)Then24. iMin=iInner25. EndIf26. NextiInner27. 'Swapthelargestwithlastslotofthesubarray28. iTemp=lngArray(iMax)29. lngArray(iMax)=lngArray(iUpper)30. lngArray(iUpper)=iTemp31. 'Swapthesmallestwiththefirstslotofthesubarray32. iTemp=lngArray(iMin)33. lngArray(iMin)=lngArray(iLower)34. lngArray(iLower)=iTemp35. Loop36. EndSub复制代码

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1