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中的元组与逻辑运算符
Oct 13 Python
python3实现UDP协议的服务器和客户端
Jun 14 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
详解python Todo清单实战
Nov 01 Python
解决Django中调用keras的模型出现的问题
Aug 07 Python
python 中xpath爬虫实例详解
Aug 26 Python
Python celery原理及运行流程解析
Jun 13 Python
Python使用struct处理二进制(pack和unpack用法)
Nov 12 Python
Python基础之pandas数据合并
Apr 27 Python
Python基础知识学习之类的继承
May 31 Python
详解如何用Python实现感知器算法
Jun 18 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实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
豆瓣网的jquery代码实例
2008/06/15 Javascript
Jquery 弹出层插件实现代码
2009/10/24 Javascript
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python实现破解猜数游戏算法示例
2017/09/25 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
python中将正则过滤的内容输出写入到文件中的实例
2018/10/21 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
python中wheel的用法整理
2020/06/15 Python
详解Python GUI编程之PyQt5入门到实战
2020/12/10 Python
澳大利亚相机之家:Camera House
2017/11/30 全球购物
研究生自荐信
2013/10/09 职场文书
先进工作者推荐材料
2014/12/23 职场文书
煤矿安全保证书
2015/02/27 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Python基础之常用库常用方法整理
2021/04/30 Python