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 pcm音频添加头转成Wav格式文件的方法
Jan 09 Python
python实现词法分析器
Jan 31 Python
使用python3构建文件传输的方法
Feb 13 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
Python编程中类与类的关系详解
Aug 08 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
python Tensor和Array对比分析
Jan 08 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
学python爬虫能做什么
Jul 29 Python
python time()的实例用法
Nov 03 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抽象工厂模式(Elgg)
2010/03/21 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
2013/05/15 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
JS基础随笔(菜鸟必看篇)
2016/07/13 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
jquery实现企业定位式导航效果
2018/01/01 jQuery
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
python从入门到精通(DAY 1)
2015/12/20 Python
Python解惑之整数比较详解
2017/04/24 Python
Python实现的选择排序算法示例
2017/11/29 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Django多数据库联用实现方法解析
2020/11/12 Python
python中spy++的使用超详细教程
2021/01/29 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
户外用品商店创业计划书
2014/01/29 职场文书
工作总结与自我评价
2014/09/18 职场文书
企业宣传语大全
2015/07/13 职场文书
保姆聘用合同
2015/09/21 职场文书
辞职申请书范本
2019/05/20 职场文书
Python实现byte转integer
2021/06/03 Python