<强>前言强>
上一篇文章写了一个自顶向下的归并排序,把一个完整的数组不断二分,然后再合并。其实换一种思路:把数组中相邻的N个元素看成是已经二分好了的,直接进行合并,就省掉了二分那一步骤
自底向上的归并排序示意图
<强> c++实现:强>
template空白mergeSortButton2Top (T arr [], int n) { for (int大?1;大小& lt;=n;大小尺寸+=){ for (int i=0;我+大小& lt;n;我+=2 *大小)//对[我+号]和[+大小,我+ 2 *号)进行归并 __merge(加勒比海盗,我,我+大小- 1分钟(我+ +大小- 1,n - 1));//arr中期左右如果我+ 2 * size> n了,越界了,就取n - 1 } } template 空白__merge (T arr [], int, int中期,int){//将arr(左,中)和arr[中期+ 1]两部分进行归并 T * tmp=new T(左边/右边+ 1); for (int i=左;我& lt;=正确;我+ +) tmp arr [i -左]=[我];//先把arr(需要合并的左右片段)复制给tmp int i=左,j=中期+ 1;//我做为左半部分的指针j作为右半部分的指针 for (int k=;k & lt;=正确;k + +) { 如果我比;中期){//左半部分已经合入完了,将右半部分剩下的全部合入 arr [k]=tmp [j -左); + +; } else if (j比;){//右半部分已经合入完了,将左半部分剩下的全部合入 arr [k]=tmp (i -左); 我+ +; } else if (tmp (i -左)& lt;tmp [j -左)){ arr [k]=tmp (i -左); 我+ +; } 其他{ arr [k]=tmp [j -左); + +; } } 删除[]tmp; } int main () { int arr[9]={1、5、6, 78, 12日5日1日12日,54个}; mergeSortButton2Top (arr 9); for (int i=0;我& lt;9;我+ +){ cout & lt; & lt;加勒比海盗[我]& lt; & lt;“”; } 返回0; } >之前 <强> GoLang实现:强>
func mergeSortButton2Top (arr int []) { var披散下来int len (arr)=大小:=1;大小& lt;=披散下来;尺寸+={ 我:=0;我+大小& lt;披散下来;我+=2 *大小{//对[我+号]和[+大小,我+ 2 *号)进行归并 合并(加勒比海盗,我,我+号,int (math.Min (float64 (i + 2 *号),float64 (lenth-1))))//arr中期左右如果我+ 2 * size> n了,越界了,就取n - 1 } } } 函数合并(arr int[],左,中,右int) {//将要合并的部分做个拷贝 var tmp int[]=使(int[],左边/右边+ 1) 对于我来说,j:=左,0;我& lt;=正确;我+ + { tmp arr [j]=[我] j + + }//我做为左半部分的指针j作为右半部分的指针 中期var i, j int=, + 1 凯西:=;k & lt;=正确;k + + { 如果我在中期{//左半部分已经合入完了,将右半部分剩下的全部合入 arr [k]=tmp [j-left] j + + 其他}如果j比;{//右半部分已经合入完了,将左半部分剩下的全部合入 arr [k]=tmp[我] 我+ + 其他}如果tmp[我]比;tmp (j-left) { arr [k]=tmp [j-left] j + + 其他}{ arr [k]=tmp[我] 我+ + } } } >之前用golang对两种归并排序进行计时,观察性能:
func createRandomArray (int数)int [] { .UnixNano rand.Seed (time.Now () ()) var arr int[]=使(int [], 0) 我:=0;我& lt;计数;我+ + { arr=append (arr rand.Intn (100)) } 返回加勒比海盗 } 函数main () { 数:=10000 加勒比海盗:=createRandomArray(计数) var arr2 int[]=使(int[],计数) 复制(arr2 arr) 开始:=time.Now () 归并排序(arr 0 len (arr) 1) fmt。Println(“自顶向下归并排序用时:“,time.Since(开始) 开始=time.Now () mergeSortButton2Top (arr2) fmt。Println(“自底向上归并排序用时:“,time.Since(开始) }//输出://自顶向下归并排序用时:4.997 ms//自底向上归并排序用时:3.9987 ms >之前因为自底向上少了二分那个步骤,性能要优于自顶向下的归并排序
<强>总结强>
到此这篇关于c++/GoLang如何实现自底向上的归并排序的文章就介绍到这了,更多相关c++/GoLang自底向上的归并排序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
c++/GoLang如何实现自底向上的归并排序