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 相关文章推荐
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
django允许外部访问的实例讲解
May 14 Python
Python对象属性自动更新操作示例
Jun 15 Python
Python 加密与解密小结
Dec 06 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python处理session的方法整理
Aug 29 Python
Series和DataFrame使用简单入门
Nov 13 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
django的autoreload机制实现
Jun 03 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
Python 数据分析之逐块读取文本的实现
Dec 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通过cookies获取远程网页的指定代码
2013/06/25 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
深入理解PHP中的global
2014/08/19 PHP
详解js异步文件加载器
2016/01/24 PHP
Javascript valueOf 使用方法
2008/12/28 Javascript
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
2018/03/05 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
初学Python实用技巧两则
2014/08/29 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
详解python中的 is 操作符
2017/12/26 Python
python实现单向链表详解
2018/02/08 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
亚洲独特体验旅游专家:eOasia
2018/08/15 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
社区国庆节活动方案
2014/02/05 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
爱情寄语大全
2014/04/09 职场文书
教师读书活动总结
2014/05/07 职场文书
建议书格式
2015/02/04 职场文书
教育教学工作反思
2016/02/24 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
导游词之江西赣州
2019/10/15 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python