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 yield 使用浅析
May 28 Python
Python编程实战之Oracle数据库操作示例
Jun 21 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
将python图片转为二进制文本的实例
Jan 24 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
Jun 17 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
python获取引用对象的个数方式
Dec 20 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
Python中flatten( ),matrix.A用法说明
Jul 05 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/11/18 PHP
php中使用url传递数组的方法
2015/02/11 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
PHP实现基于状态的责任链审批模式详解
2019/05/31 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
html读出文本文件内容
2007/01/22 Javascript
javascript 跳转代码集合
2009/12/03 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
js数组去重的常用方法总结
2014/01/24 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
JavaScript中的style.cssText使用教程
2014/11/06 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
js实现登录验证码
2016/12/22 Javascript
原生JS实现导航下拉菜单效果
2020/11/25 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
python爬虫入门教程之糗百图片爬虫代码分享
2014/09/02 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
python里dict变成list实例方法
2019/06/26 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
2014年社区植树节活动方案
2014/02/28 职场文书
营销总监岗位职责
2014/09/16 职场文书
农村文化建设标语
2014/10/07 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫