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 相关文章推荐
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
Python内置函数 next的具体使用方法
Nov 24 Python
利用Python找出序列中出现最多的元素示例代码
Dec 08 Python
Python使用pip安装pySerial串口通讯模块
Apr 20 Python
python中字符串的操作方法大全
Jun 03 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
Python中一些深不见底的“坑”
Jun 12 Python
Django的models中on_delete参数详解
Jul 16 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
基于python爬取梨视频实现过程解析
Nov 09 Python
基于Python实现天天酷跑功能
Jan 06 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
PHP 常用的header头部定义汇总
2015/06/19 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
关于二级域名下使用一级域名下的COOKIE的问题
2011/11/07 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
jQuery删除当前节点元素
2016/12/07 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
在SAE上部署Python的Django框架的一些问题汇总
2015/05/30 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Python探索之创建二叉树
2017/10/25 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python函数参数操作详解
2018/08/03 Python
python 用下标截取字符串的实例
2018/12/25 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
酒店司机岗位职责
2013/12/14 职场文书
团队精神演讲稿
2013/12/31 职场文书
合作经营协议书范本
2014/09/16 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python