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多线程扫描端口示例
Jan 16 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
python中while循环语句用法简单实例
May 07 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
python文件写入write()的操作
May 14 Python
Python中新式类与经典类的区别详析
Jul 10 Python
Python实现的微信红包提醒功能示例
Aug 22 Python
python清空命令行方式
Jan 13 Python
python游戏开发的五个案例分享
Mar 09 Python
Django ValuesQuerySet转json方式
Mar 16 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 Python
使用python如何删除同一文件夹下相似的图片
May 07 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版本如何选择?应该使用哪个版本?
2015/05/13 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
python使用PyFetion来发送短信的例子
2014/04/22 Python
Python中的异常处理学习笔记
2015/01/28 Python
django模型层(model)进行建表、查询与删除的基础教程
2017/11/21 Python
python实现五子棋小游戏
2020/03/25 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Python配置文件处理的方法教程
2019/08/29 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
大学竞选班长演讲稿
2014/04/24 职场文书
大学生毕业求职信
2014/06/12 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
119消防日活动总结
2014/08/29 职场文书
技术经济专业求职信
2014/09/03 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
安全保证书格式
2015/02/28 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Oracle创建只读账号的详细步骤
2021/06/07 Oracle
MySQL空间数据存储及函数
2021/09/25 MySQL