详细

Excel VBA编程技巧 之 排序算法初探

来源:24小时澳门在线娱乐sbAPP 时间:2019-04-04 09:31浏览量: 【字号:

本帖最后由lee1892于2013-4-2010:51编辑进阶的排序算法名称稳定性最佳时间复杂度平均时间复杂度最差时间复杂度空间复杂度排序方式合并排序是O(nlogn)O(nlogn)O(nlogn)O(n)合并堆排序否O(nlogn)O(nlogn)O(nlogn)O(1)选择快速排序否O(nlogn)O(nlogn)O(n^2)O(logn)堆栈空间交换希尔排序否O(n)O[n(logn)^2]或O(n^)O[n(logn)^2]O(1)插入合并排序运作方式:1、合并排序是基于合并操作的一种算法,所谓合并操作是指将两组有序数据合并为一个有序数据的操作。

其实现方式是:a、申请足够的结果数据存储空间;b、设置两个指针分别指向两组有序数据的第一个元素;c、比较两个指针指向的元素,按所需顺序,将其中一个存至结果空间,并向后移动该指针;d、重复上一步操作,直至某一个指针为空(该组数据全部移动完成);e、将剩余的数据顺序存至结果空间。

2、其具体的实现,又可分为两种方式:由上至下、由下至上。 3、由上至下,递归过程:a、将待排序数据均分为两组,称为左、右b、分别将左右两组数据作为待排序数据代入步骤a,分为两组c、重复上述操作,直至待排序数据仅剩一个元素d、合并左右两组数据,递归4、由下至上,迭代过程:a、视单个元素为一组有序数据,则全部数据可视为数量为元素数量个的有序数据b、将前后两个有序数据合并为一个新的有序数据,有序数据的数量减半c、重复上述步骤,直至仅剩一个有序数据由上至下的VBA实现:[code=vb]SubMergeSort_UpDown(ByRefarr)DimnLen,nMid,aLeft,aRight,inLen=UBound(arr)IfnLen=1ThenExitSub如果数组长度为1,则退出nMid=Int(nLen/2)ReDimaLeft(1TonMid)ReDimaRight(1TonLen-nMid)Fori=1TonMidaLeft(i)=arr(i)NextFori=nMid+1TonLenaRight(i-nMid)=arr(i)NextCallMergeSort_UpDown(aLeft)CallMergeSort_UpDown(aRight)CallMerge(arr,aLeft,aRight)EndSubPrivateSubMerge(ByRefarr,ByRefaLeft,ByRefaRight)Dimi,aTemp,nLeftLen,nRightLen,nLeftInd,nRightInd,nTempIndnLeftLen=UBound(aLeft):nRightLen=UBound(aRight)ReDimaTemp(1TonLeftLen+nRightLen)nLeftInd=1:nRightInd=1:nTempInd=1DoWhilenLeftInd=nLeftLenAndnRightInd=nRightLenIfaLeft(nLeftInd)aRight(nRightInd)ThenaTemp(nTempInd)=aLeft(nLeftInd)nLeftInd=nLeftInd+1ElseaTemp(nTempInd)=aRight(nRightInd)nRightInd=nRightInd+1EndIfnTempInd=nTempInd+1LoopIfnLeftInd=nLeftLenThenFori=nLeftIndTonLeftLenaTemp(nTempInd)=aLeft(i)nTempInd=nTempInd+1NextEndIfIfnRightInd=nRightLenThenFori=nRightIndTonRightLenaTemp(nTempInd)=aRight(i)nTempInd=nTempInd+1NextEndIfarr=aTempEndSub[/code]由下至上的VBA实现:[code=vb]SubMergeSort_BottomUp(ByRefarr)Dimi,nLen,aTempDimnLeftMin,nLeftMax,nRightMin,nRightMax,nNextnLen=UBound(arr)ReDimaTemp(1TonLen)i=1DoWhilei=nLennLeftMin=1DoWhilenLeftMin=nLen-inLeftMax=nLeftMin+inRightMin=nLeftMaxnRightMax=nLeftMax+iIfnRightMaxnLenThennRightMax=nLen+1nNext=1DoWhilenLeftMinnLeftMaxAndnRightMinnRightMaxIfarr(nLeftMin)arr(nRightMin)ThenaTemp(nNext)=arr(nRightMin)nRightMin=nRightMin+1ElseaTemp(nNext)=arr(nLeftMin)nLeftMin=nLeftMin+1EndIfnNext=nNext+1LoopDoWhilenLeftMinnLeftMaxnRightMin=nRightMin-1nLeftMax=nLeftMax-1arr(nRightMin)=arr(nLeftMax)LoopDoWhilenNext1nRightMin=nRightMin-1nNext=nNext-1arr(nRightMin)=aTemp(nNext)LoopnLeftMin=nRightMaxLoopi=i*2LoopEndSub[/code]下图为由下至上的合并算法可视化图:。

相关新闻:
上一篇:吴政隆在响水召开处置工作专题会议 连续作战全力抢险救援 下一篇:社保基金“打新”12天猛赚6401.9万元