介绍
归并排序——如何使用golang和python实现?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>归并排序强>
思路:将数组不断二分,然后合并为有序数组
<强> c++实现:强>
空白归并排序(T arr [], int, int){//对arr(左、右)的范围进行排序 如果(左祝辞=) 返回; int中期=(左+右)/2; 归并排序(加勒比海盗,左,中期); 归并排序(加勒比海盗,中期+ 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; }
GoLang实现:
func归并排序(arr int[],左,右int) { 如果在正确={ 返回 } 中期:=左+(左边/右边)/2 归并排序(加勒比海盗,左,中期)//递归调用,分别对左右部分进行归并排序 归并排序(加勒比海盗,中期+ 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[我] 我+ + } } }
<>强python实现:强>
python的实现方法和上面不一样,上面两种方法都是在原始数组上直接进行修改的
def归并排序(arr): 如果len (arr) & lt;=1: 返回加勒比海盗=len (arr)/中期/2 左=归并排序(arr[:中期])#分别对左右部分排序 正确的=归并排序(arr[中期:]) 返回合并(左、右)#合并左右部分为有序数组 def合并(左,右): 结果=[] ,right.pop num_left num_right=left.pop(0)(0) #分别取出左右部分的第0个元素 而真正的: 如果num_left & lt;num_right: result.append (num_left) 试一试: num_left=left.pop (0) 除了IndexError: result.append (num_right) result.extend(右) 打破 其他: result.append (num_right) 试一试: num_right=right.pop (0) 除了IndexError: result.append (num_left) result.extend(左) 打破 返回结果 if __name__==& # 39; __main__ # 39;: 从随机进口洗牌 arr=列表(范围(30)) 洗牌(arr) arr=归并排序(arr) 打印(arr)
关于归并排序——如何使用golang和python实现问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。