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脚本暴力破解栅栏密码
Oct 19 Python
详解Python Socket网络编程
Jan 05 Python
python Django批量导入数据
Mar 25 Python
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python 使用 requests 模块发送http请求 的方法
Dec 09 Python
python代码 输入数字使其反向输出的方法
Dec 22 Python
Python实现多进程的四种方式
Feb 22 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
Python常遇到的错误和异常
Nov 02 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
基于文本的留言簿
2006/10/09 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
PHP简单实现DES加密解密的方法
2016/07/12 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
Javascript 按位与运算符 (&amp;)使用介绍
2014/02/04 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
canvas知识总结
2017/01/25 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现socket端口重定向示例
2014/02/10 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
Python pass详细介绍及实例代码
2016/11/24 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
python利用pytesseract 实现本地识别图片文字
2020/12/14 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
护理职业应聘自荐书
2013/09/29 职场文书
公司道歉信范文
2014/01/09 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
《称赞》教学反思
2016/02/17 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android