SANYGROUPsystemofficeroom【SANYUA16H-SANYHUASANYUA8Q8-SANYUA1688】VBA排序的十种算法在使用VBA进行写程序时,经常会做排序,下面将会给出一些常用的排序算法的实现,方便大家写程序参考,若代码中出现了错误,欢迎高手指正。主要算法有:1、(冒泡排序)Bubblesort2、(选择排序)Selectionsort3、(插入排序)Insertionsort4、(快速排序)Quicksort5、(合并排序)Mergesort6、(堆排序)Heapsort7、(组合排序)CombSort8、(希尔排序)ShellSort9、(基数排序)RadixSort10、ShakerSort第一种(冒泡排序)BubblesortPublicSubBubbleSort(ByReflngArray()AsLong)DimiOuterAsLongDimiInnerAsLongDimiLBoundAsLongDimiUBoundAsLongDimiTempAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)'冒泡排序ForiOuter=iLBoundToiUBound-1ForiInner=iLBoundToiUBound-iOuter-1'比较相邻项IflngArray(iInner)>lngArray(iInner+1)Then'交换值iTemp=lngArray(iInner)lngArray(iInner)=lngArray(iInner+1)lngArray(iInner+1)=iTempEndIfNextiInnerNextiOuterEndSub2、(选择排序)SelectionsortPublicSubSelectionSort(ByReflngArray()AsLong)DimiOuterAsLongDimiInnerAsLongDimiLBoundAsLongDimiUBoundAsLongDimiTempAsLongDimiMaxAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)'选择排序ForiOuter=iUBoundToiLBound+1Step-1iMax=0'得到最大值得索引ForiInner=iLBoundToiOuterIflngArray(iInner)>lngArray(iMax)TheniMax=iInnerNextiInner'值交换iTemp=lngArray(iMax)lngArray(iMax)=lngArray(iOuter)lngArray(iOuter)=iTempNextiOuterEndSub复制代码第三种(插入排序)InsertionsortPublicSubInsertionSort(ByReflngArray()AsLong)DimiOuterAsLongDimiInnerAsLongDimiLBoundAsLongDimiUBoundAsLongDimiTempAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)ForiOuter=iLBound+1ToiUBound'取得插入值iTemp=lngArray(iOuter)'移动已经排序的值ForiInner=iOuter-1ToiLBoundStep-1IflngArray(iInner)<=iTempThenExitForlngArray(iInner+1)=lngArray(iInner)NextiInner'插入值lngArray(iInner+1)=iTempNextiOuterEndSub复制代码第四种(快速排序)QuicksortPublicSubQuickSort(ByReflngArray()AsLong)DimiLBoundAsLongDimiUBoundAsLongDimiTempAsLongDimiOuterAsLongDimiMaxAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)'若只有一个值,不排序If(iUBound-iLBound)ThenForiOuter=iLBoundToiUBoundIflngArray(iOuter)>lngArray(iMax)TheniMax=iOuterNextiOuteriTemp=lngArray(iMax)lngArray(iMax)=lngArray(iUBound)lngArray(iUBound)=iTemp'开始快速排序InnerQuickSortlngArray,iLBound,iUBoundEndIfEndSubPrivateSubInnerQuickSort(ByReflngArray()AsLong,ByValiLeftEndAsLong,ByValiRightEndAsLong)DimiLeftCurAsLongDimiRightCurAsLongDimiPivotAsLongDimiTempAsLongIfiLeftEnd>=iRightEndThenExitSubiLeftCur=iLeftEndiRightCur=iRightEnd+1iPivot=lngArray(iLeftEnd)DoDoiLeftCur=iLeftCur+1LoopWhilelngArray(iLeftCur)iPivotIfiLeftCur>=iRightCurThenExitDo'交换值iTemp=lngArray(iLeftCur)lngArray(iLeftCur)=lngArray(iRightCur)lngArray(iRightCur)=iTempLoop'递归快速排序lngArray(iLeftEnd)=lngArray(iRightCur)lngArray(iRightCur)=iPivotInnerQuickSortlngArray,iLeftEnd,iRightCur-1InnerQuickSortlngArray,iRightCur+1,iRightEndEndSub复制代码第五种(合并排序)MergesortPublicSubMergeSort(ByReflngArray()AsLong)DimarrTemp()AsLongDimiSegSizeAsLongDimiLBoundAsLongDimiUBoundAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)ReDimarrTemp(iLBoundToiUBound)iSegSize=1DoWhileiSegSizeiEndFirstThenForiOuter=iSecondToiEndSecondlngDest(iResult)=lngSrc(iOuter)iResult=iResult+1NextiOuterElseForiOuter=iFirstToiEndFirstlngDest(iResult)=lngSrc(iOuter)iResult=iResult+1NextiOuterEndIfEndSub复制代码第六种(堆排序)HeapsortPublicSubHeapSort(ByReflngArray()AsLong)DimiLBoundAsLongDimiUBoundAsLongDimiArrSizeAsLongDimiRootAsLongDimiChildAsLongDimiElementAsLongDimiCurrentAsLongDimarrOut()AsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)iArrSize=iUBound-iLBoundReDimarrOut(iLBoundToiUBound)'Initialisetheheap'MoveuptheheapfromthebottomForiRoot=iArrSize\2To0Step-1iElement=lngArray(iRoot+iLBound)iChild=iRoot+iRoot'MovedowntheheapfromthecurrentpositionDoWhileiChild=lngArray(iChild+iLBound)ThenExitDolngArray((iChild\2)+iLBound)=lngArray(iChild+iLBound)iChild=iChild+iChildLoop'MovethenodelngArray((iChild\2)+iLBound)=iElementNextiRoot'Readofvaluesonebyone(storeinarraystartingattheend)ForiRoot=iUBoundToiLBoundStep-1'ReadthevaluearrOut(iRoot)=lngArray(iLBound)'GetthelastelementiElement=lngArray(iArrSize+iLBound)iArrSize=iArrSize-1iCurrent=0iChild=1'FindaplaceforthelastelementtogoDoWhileiChild<=iArrSizeIfiChild=lngArray(iChild+iLBound)ThenExitDolngArray(iCurrent+iLBound)=lngArray(iChild+iLBound)iCurrent=iChildiChild=iChild+iChildLoop'MovethenodelngArray(iCurrent+iLBound)=iElementNextiRoot'CopyfromtemparraytorealarrayForiRoot=iLBoundToiUBoundlngArray(iRoot)=arrOut(iRoot)NextiRootEndSub复制代码第七种(组合排序)CombSortPublicSubCombSort(ByReflngArray()AsLong)DimiSpacingAsLongDimiOuterAsLongDimiInnerAsLongDimiTempAsLongDimiLBoundAsLongDimiUBoundAsLongDimiArrSizeAsLongDimiFinishedAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)'InitialisecombwidthiSpacing=iUBound-iLBoundDoIfiSpacing>1TheniSpacing=Int(iSpacing/1.3)IfiSpacing=0TheniSpacing=1'Dontgolowerthan1ElseIfiSpacing>8AndiSpacing<11TheniSpacing=11'Thisisaspecialnumber,goesfasterthan9and10EndIfEndIf'Alwaysgodownto1beforeattemptingtoexitIfiSpacing=1TheniFinished=1'CombingpassForiOuter=iLBoundToiUBound-iSpacingiInner=iOuter+iSpacingIflngArray(iOuter)>lngArray(iInner)Then'SwapiTemp=lngArray(iOuter)lngArray(iOuter)=lngArray(iInner)lngArray(iInner)=iTemp'NotfinishediFinished=0EndIfNextiOuterLoopUntiliFinishedEndSub复制代码第八种(希尔排序)ShellSortPublicSubShellSort(ByReflngArray()AsLong)DimiSpacingAsLongDimiOuterAsLongDimiInnerAsLongDimiTempAsLongDimiLBoundAsLongDimiUBoundAsLongDimiArrSizeAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)'CalculateinitialsortspacingiArrSize=(iUBound-iLBound)+1iSpacing=1IfiArrSize>13ThenDoWhileiSpacingiMaxTheniMax=lngArray(iLoop)NextiLoop'CalculatehowmanysortsareneededDoWhileiMaxiSorts=iSorts+1iMax=iMax\256LoopiMax=1'DothesortsForiLoop=1ToiSortsIfiLoopAnd1Then'Oddsort->srctodestInnerRadixSortlngArray,arrTemp,iLBound,iUBound,iMaxElse'Evensort->desttosrcInnerRadixSortarrTemp,lngArray,iLBound,iUBound,iMaxEndIf'NextsortfactoriMax=iMax*256NextiLoop'IfoddnumberofsortsweneedtoswapthearraysIf(iSortsAnd1)ThenForiLoop=iLBoundToiUBoundlngArray(iLoop)=arrTemp(iLoop)NextiLoopEndIfEndSubPrivateSubInnerRadixSort(ByReflngSrc()AsLong,ByReflngDest()AsLong,ByValiLBoundAsLong,ByValiUBoundAsLong,ByValiDivisorAsLong)DimarrCounts(255)AsLongDimarrOffsets(255)AsLongDimiBucketAsLongDimiLoopAsLong'CounttheitemsforeachbucketForiLoop=iLBoundToiUBoundiBucket=(lngSrc(iLoop)\iDivisor)And255arrCounts(iBucket)=arrCounts(iBucket)+1NextiLoop'GenerateoffsetsForiLoop=1To255arrOffsets(iLoop)=arrOffsets(iLoop-1)+arrCounts(iLoop-1)+iLBoundNextiLoop'FillthebucketsForiLoop=iLBoundToiUBoundiBucket=(lngSrc(iLoop)\iDivisor)And255lngDest(arrOffsets(iBucket))=lngSrc(iLoop)arrOffsets(iBucket)=arrOffsets(iBucket)+1NextiLoopEndSub复制代码第十种ShakerSortPublicSubShakerSort(ByReflngArray()AsLong)DimiLowerAsLongDimiUpperAsLongDimiInnerAsLongDimiLBoundAsLongDimiUBoundAsLongDimiTempAsLongDimiMaxAsLongDimiMinAsLongiLBound=LBound(lngArray)iUBound=UBound(lngArray)iLower=iLBound-1iUpper=iUBound+1DoWhileiLowerlngArray(iMax)TheniMax=iInnerElseIflngArray(iInner)
本文档为【VBA排序的十种算法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。