golang/python实现归并排序实例代码
作者:NothingLeft了 发布时间:2023-12-13 04:19:01
标签:golang,python,归并排序
归并排序
思路:将数组不断二分,然后合并为有序数组
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)
来源:https://www.jianshu.com/p/0abb8b4045e1
0
投稿
猜你喜欢
- 解决anaconda打不开的问题,亲测成功!!彻底卸载四步骤1.找到anaconda的安装路径,删除envs文件和pkgs文件2.运行ana
- 本文实例讲述了Python使用matplotlib简单绘图。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!
- 生成HTML方法主要步骤只有两个:一、获取要生成的html文件的内容二、将获取的html文件内容保存为html文件我在这里主要说明的只是第一
- 手机控件查看工具uiautomatorviewer工具简介用来扫描和分析Android应用程序的UI控件的工具.如何使用 1.进入
- PDO::_constructPDO::_construct — 创建一个表示数据库连接的 PDO 实例(PHP 5 >= 5.1.0
- 生活形态(Life-Style)的概念源自社会学与心理学,六十年代即有学者正式引用到市场营销领域,并运用其心理影射与多维度等特质,着力解释人
- python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。有一点需要清楚
- 现在网页的设计都讲究整体统一风格,无论是网页的文字、图像,还是浏览器的滚动条都要求颜色和风
- 1、cat:拼接直接合并数据2、stack拼接:与cat不同的是,stack创建了一个新的维度,在拼接的同时,给数据增加了类别。并且stac
- 在IE下,获取Param的时候有个诡异现象(不知道算不算bug)。为了清晰起见,下面用最简单的HTML和JavaScript来说明。有这么一
- Python有一随机函数可以产生[0,1)区间内的随机数,基于此函数生成随机分布在任意三角形内的点由数学知识得知:几何体的向量表达形式直线:
- 前言在前几篇博客中,分别就棋子的颜色识别、模板匹配等定位方式进行了介绍和实践,这一篇博客就来验证一下github中最热门的跳一跳 * 中采用的
- Scrapy下载图片项目介绍Scrapy是一个适用爬取网站数据、提取结构性数据的应用程序框架,它可以通过定制化的修改来满足不同的爬虫需求。使
- 1. Python模块和包:一切从基础开始Python模块是一个Python文件,包含一些相关的函数、类或变量的定义,可以通过 i
- 本文实例讲述了Python基于pyCUDA实现GPU加速并行计算功能。分享给大家供大家参考,具体如下:Nvidia的CUDA 架构为我们提供
- 本文实例讲述了php返回相对时间(如:20分钟前,3天前)的方法。分享给大家供大家参考。具体如下:function plural($num)
- 一、打开一个网页获取所有的内容from urllib import urlopendoc = urlopen("http://ww
- 1. 问题使用PyCharm 创建完Django 项目 想登录admin 页面 却不知道用户名和密码。 用的默认sqlit2.解决办法2.1
- python爬虫模块Request的安装在cmd中,使用如下指令安装requests:pip install requestspython爬
- 1.单独使用Pillow包时,图片会弹出新窗口显示:from Pillow import Imageimg = Image.open(