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通过邮件服务器端口发送邮件的方法
Apr 30 Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 Python
实例讲解Python中函数的调用与定义
Mar 14 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python BS4库的安装与使用详解
Aug 08 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
解决python有时候import不了当前的包问题
Aug 28 Python
Pandas DataFrame中的tuple元素遍历的实现
Oct 23 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
python把一个字符串切开的实例方法
Sep 27 Python
Python基础之常用库常用方法整理
Apr 30 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
php2html php生成静态页函数
2008/12/08 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
JS中的this变量的使用介绍
2013/10/21 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
Python双向循环链表实现方法分析
2018/07/30 Python
解读python如何实现决策树算法
2018/10/11 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Python变量访问权限控制详解
2019/06/29 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
Python函数生成器原理及使用详解
2020/03/12 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
ZWILLING双立人法国网上商店:德国刀具锅具厨具品牌
2019/08/28 全球购物
最新党员思想汇报
2014/01/01 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
小学数学教研活动总结
2014/07/01 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
城管个人总结
2015/02/28 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书