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分析apache访问日志脚本分享
Feb 26 Python
[原创]pip和pygal的安装实例教程
Dec 07 Python
PyQt5每天必学之进度条效果
Apr 19 Python
详解django.contirb.auth-认证
Jul 16 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
python 按钮点击关闭窗口的实现
Mar 04 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
Pandas读取csv时如何设置列名
Jun 02 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
Django怎么在admin后台注册数据库表
Nov 14 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设计模式 注册表模式
2012/02/05 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
php网站地图生成类示例
2014/01/13 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
PHP实现货币换算的方法
2014/11/29 PHP
php将12小时制转换成24小时制的方法
2015/03/31 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
jQuery插件FusionCharts绘制的3D双柱状图效果示例【附demo源码】
2017/04/20 jQuery
Swiper实现轮播图效果
2017/07/03 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
python实现目录树生成示例
2014/03/28 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
浅析python继承与多重继承
2018/09/13 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
JavaScript获取当前url根目录(路径)
2014/02/19 面试题
Ruby如何创建一个线程
2013/03/10 面试题
大专毕业生自我鉴定
2013/11/21 职场文书
简历上的自我评价怎么写
2014/01/28 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
素质拓展训练感想
2015/08/07 职场文书
详解Python 3.10 中的新功能和变化
2021/04/28 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang