前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go实现归并排序

go实现归并排序

原创
作者头像
Johns
发布2022-08-12 00:02:06
3870
发布2022-08-12 00:02:06
举报
文章被收录于专栏:代码工具

介绍

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治策略.

分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果。

实现

实现上有点类似二叉树的一个后序遍历, 先左右, 最后再根(合并)

代码语言:go
复制
package main

import "fmt"

func main() {
	arr := []int{0, 8, 0, 10, 5, 4, 2, 0, 1, 7}
	ret := MergeSort(arr)
	fmt.Println(ret)
}

// 归并排序
func MergeSort(nums []int) []int {
	arrLen := len(nums)
	if arrLen < 2 {
		return nums
	}
	i := arrLen >> 1

	// 利用定义,排序左半部分
	left := MergeSort(nums[0:i])

	// 利用定义,排序右半部分
	right := MergeSort(nums[i:])

	/****** 后序位置 ******/
	// 此时两部分子数组已经被排好序
	// 合并两个有序数组
	return merge(left, right)
}

func merge(left []int, right []int) []int {
	m := len(left)
	n := len(right)
	result := make([]int, m+n, m+n)
	i, j, k := 0, 0, 0
	for i < m && j < n {
		if left[i] >= right[j] {
			result[k] = left[i]
			i++
		} else {
			result[k] = right[j]
			j++
		}
		k++
	}

	// 左边先完成, 右边还有剩余未合并的数据
	if i == m {
		for j < n {
			result[k] = right[j]
			k++
			j++
		}
	}

	// 右边边先完成, 左边还有剩余未合并的数据
	if j == n {
		for i < m {
			result[k] = left[i]
			k++
			i++
		}
	}

	return result
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档