在Go中合并两个排序的数组的方法

253 阅读1分钟

概述

给出了两个数组。这两个数组都是经过排序的

  • 第一个数组的长度为m+n

  • 第二个数组的长度为n

我们的目标是合并这些排序的数组。第一个数组包含足够的长度,所以第一个数组应该只被修改。

Input1: [2,3,4,0,0]
Input2: [1,5]
Output: [1, 2, 3, 4, 5]

Input1: [4,5,0,0,0,0]
Input2: [1, 2, 3, 7]
Output: [1, 2, 3, 4, 5, 7]

以下是我们可以采取的方法

  • 将第一个数组中的所有元素按排序顺序移到最后。第一个数组将成为
[0,0,2,3,4]
  • 现在从第一个数组的第m个索引元素和第二个数组的第0个索引开始。

  • 比较两者,将较小的放在第一个数组中的第0个索引处。第一个数组将成为

[1, 0, 2, 3, 4]
  • 重复这个过程。由于我们有足够的空间,第一个数组末尾的值将在被覆盖之前被放在前面。

程序

下面是同样的程序。

package main

import "fmt"

func merge(nums1 []int, m int, nums2 []int, n int) []int {

	if m == 0 {
		for k := 0; k < n; k++ {
			nums1[k] = nums2[k]
		}
		return nums1
	}
	nums1 = moveToEnd(nums1, m)
	i := n
	j := 0
	for k := 0; k < m+n; k++ {
		if i < m+n && j < n {
			if nums1[i] < nums2[j] {
				nums1[k] = nums1[i]
				i++
			} else {
				nums1[k] = nums2[j]
				j++
			}
		} else if j < n {
			nums1[k] = nums2[j]
			j++
		}

	}

	return nums1

}

func moveToEnd(nums []int, m int) []int {
	lenNums := len(nums)

	k := lenNums

	for i := m - 1; i >= 0; i-- {
		nums[k-1] = nums[i]
		k--
	}

	return nums
}

func main() {
	output := merge([]int{2, 3, 4, 0, 0}, 3, []int{1, 5}, 2)
	fmt.Println(output)

	output = merge([]int{4, 5, 0, 0, 0, 0}, 2, []int{1, 2, 3, 7}, 4)
	fmt.Println(output)
}

输出

[1 2 3 4 5]
[1 2 3 4 5 7]