golang/python实现归并排序实例代码


Posted in Python onAugust 30, 2020

归并排序

思路:将数组不断二分,然后合并为有序数组

C++实现:

void mergeSort(T arr[], int left,int right) { //对arr[left,right]的范围进行排序
 if (left >= right)
  return;
 int mid = (left + right) / 2;
 mergeSort(arr, left, mid);
 mergeSort(arr, mid + 1, right); 
 merge(arr, left, mid, right); //合并两部分
}

template<typename T>
void __merge(T arr[], int left, int mid, int right) { //将arr[left,mid] 和 arr[mid+1,right] 两部分进行归并

 T *tmp=new T[right-left+1];
 for (int i = left; i <= right; i++)
  tmp[i - left] = arr[i]; //先把arr(需要合并的左右片段) 复制给tmp

 int i = left, j = mid + 1; // i 做为左半部分的指针 j作为右半部分的指针
 for (int k = left; k <= right; k++) {
  if (i > mid) { // 左半部分 已经合入完了,将右半部分剩下的 全部合入
   arr[k] = tmp[j - left];
   j++;
  }
  else if (j > right) { // 右半部分 已经合入完了,将左半部分剩下的 全部合入
   arr[k] = tmp[i - left];
   i++;
  }
  else if (tmp[i - left] < tmp[j - left]) {
   arr[k] = tmp[i - left];
   i++;
  }
  else {
   arr[k] = tmp[j - left];
   j++;
  }
 }
 delete[] tmp;
}

GoLang实现:

func mergeSort(arr []int, left, right int) {
 if left >= right {
  return
 }
 mid := left + (right-left)/2
 mergeSort(arr, left, mid) // 递归调用,分别对左右部分进行归并排序
 mergeSort(arr, mid+1, right)
 merge(arr, left, mid, right) // 将左右部分进行合并
}

func merge(arr []int, left, mid, right int) {
 // 将要合并的部分做个拷贝
 var tmp []int = make([]int, right-left+1)
 for i, j := left, 0; i <= right; i++ {
  tmp[j] = arr[i]
  j++
 }
 // i做为左半部分的指针 j作为右半部分的指针
 var i, j int = left, mid+1
 for k := left; k <= right; k++ {
  if i > mid { // 左半部分 已经合入完了,将右半部分剩下的 全部合入
   arr[k] = tmp[j-left]
   j++
  } else if j > right { // 右半部分 已经合入完了,将左半部分剩下的 全部合入
   arr[k] = tmp[i-left]
   i++
  } else if tmp[i-left] > tmp[j-left] {
   arr[k] = tmp[j-left]
   j++
  } else {
   arr[k] = tmp[i-left]
   i++
  }
 }
}

python实现:

python 的实现方法和上面不一样,上面两种方法都是在原始数组上直接进行修改的

def mergeSort(arr):
 if len(arr) <= 1:
  return arr
 mid = len(arr) // 2
 left = mergeSort(arr[:mid]) # 分别对左右部分排序
 right = mergeSort(arr[mid:])
 return merge(left, right) # 合并左右部分为有序数组


def merge(left, right):
 result = []
 num_left, num_right = left.pop(0), right.pop(0) # 分别取出左右部分的第0个元素
 while True:
  if num_left < num_right:
   result.append(num_left)
   try:
    num_left = left.pop(0)
   except IndexError:
    result.append(num_right)
    result.extend(right)
    break
  else:
   result.append(num_right)
   try:
    num_right = right.pop(0)
   except IndexError:
    result.append(num_left)
    result.extend(left)
    break
 return result


if __name__ == '__main__':
 from random import shuffle

 arr = list(range(30))
 shuffle(arr)
 arr = mergeSort(arr)
 print(arr)

总结

到此这篇关于golang/python实现归并排序的文章就介绍到这了,更多相关golang python归并排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python九九乘法表的实例
Sep 26 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
Python如何发布程序的详细教程
Oct 09 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
浅析python参数的知识点
Dec 10 Python
ipython和python区别详解
Jun 26 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
Keras搭建自编码器操作
Jul 03 Python
Python如何给你的程序做性能测试
Jul 29 Python
 python中的元类metaclass详情
May 30 Python
python创建文本文件的简单方法
Aug 30 #Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 #Python
Python Map 函数的使用
Aug 28 #Python
python实现单机五子棋
Aug 28 #Python
Python3+selenium配置常见报错解决方案
Aug 28 #Python
Python 中如何写注释
Aug 28 #Python
Python操作Word批量生成合同的实现示例
Aug 28 #Python
You might like
第七节 类的静态成员 [7]
2006/10/09 PHP
php面向对象的方法重载两种版本比较
2008/09/08 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP编程函数安全篇
2013/01/08 PHP
Thinkphp中的curd应用实用要点
2015/01/04 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
2013/08/09 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
2017/05/01 jQuery
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Python保存MongoDB上的文件到本地的方法
2016/03/16 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python中的对数log函数表示及用法
2020/12/09 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
html5 跨文档消息传输示例探讨
2013/04/01 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
便利店的创业计划书
2014/01/15 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
Go语言测试库testify使用学习
2022/07/23 Golang