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 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
Apr 08 Python
python使用matplotlib绘制柱状图教程
Feb 08 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
华为2019校招笔试题之处理字符串(python版)
Jun 25 Python
Python中字符串List按照长度排序
Jul 01 Python
在Django下创建项目以及设置settings.py教程
Dec 03 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
Pycharm Git 设置方法
Sep 15 Python
解决python绘图使用subplots出现标题重叠的问题
Apr 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
在字符串中把网址改成超级链接
2006/10/09 PHP
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
JS 控件事件小结
2012/10/31 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
jQuery截取指定长度字符串的实现原理及代码
2014/07/01 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
JS实现拖动滚动条评分的效果代码分享
2016/09/29 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
对python生成业务报表的实例详解
2019/02/03 Python
Python partial函数原理及用法解析
2019/12/11 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
美国留学经济担保书
2014/05/20 职场文书
社区志愿者培训方案
2014/06/10 职场文书
个人投资合作协议书
2014/10/12 职场文书
体育个人工作总结
2015/02/09 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
mysql如何配置白名单访问
2021/06/30 MySQL
centos7安装mysql5.7经验记录
2022/05/02 Servers