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处理文本文件实现生成指定格式文件的方法
Jul 31 Python
Python人脸识别初探
Dec 21 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
python实战之实现excel读取、统计、写入的示例讲解
May 02 Python
python读取文本中的坐标方法
Oct 14 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
Form表单及django的form表单的补充
Jul 25 Python
python读取指定字节长度的文本方法
Aug 27 Python
python多线程分块读取文件
Aug 29 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
Jan 23 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
smtp邮件发送一例
2006/10/09 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
php数组去重的函数代码
2013/02/03 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
JavaScript 数组的深度复制解析
2016/11/02 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
python 字符串格式化代码
2013/03/17 Python
Python中使用动态变量名的方法
2014/05/06 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python如何读写二进制数组数据
2020/08/01 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
面向对象编程OOP的优点
2013/01/22 面试题
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
致100米运动员广播稿
2014/02/14 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
交通安全月活动总结
2015/05/08 职场文书
2015年手术室工作总结
2015/05/11 职场文书
Python基础详解之描述符
2021/04/28 Python
详解TS数字分隔符和更严格的类属性检查
2021/05/06 Javascript