在Go中对0、1、2的数组进行排序的程序(Golang)

90 阅读2分钟

概述

目的是对一个0,1和2的数组进行排序,所有的0在开始,所有的1在中间,所有的2在最后。解决方案的空间复杂度应该是O(1),这意味着你不应该在给定数组的输入大小方面分配任何额外的空间。

鸡蛋

Input: [0, 1, 2, 0, 1]
Output: [0, 0, 1, 1, 2]

Input: [1, 0]
Output: [0, 1]

有两种方法可以解决这个问题

第一种方法我们可以在数组上进行迭代,并且可以保留0、1和2的计数。一旦我们有了这个计数,再在数组上迭代,先分配0的数量,然后是1的数量,最后是2的数量。

第二种方法。 在第二种方法中,我们可以有三个索引

  • 低位初始化为0

  • 中初始化为0

  • 高初始化为输入数组的长度减去1

现在在数组上迭代中间的位置

  • 如果我们遇到一个0,我们把它移到左边的low位置。递增lowmid

  • 如果我们遇到一个1,我们只需做mid++

  • 如果我们遇到一个2,我们只需将它移到右边的位置high。递减高位

以下是相同的程序

第一种方法 - 使用计数

package main

import "fmt"

func main() {
	sortNums([]int{2, 0, 2, 1, 1, 0})
}

func sortNums(nums []int) {
	zeroCount := 0
	oneCount := 0
	twoCount := 0

	for i := 0; i < len(nums); i++ {
		switch nums[i] {
		case 0:
			zeroCount++
		case 1:
			oneCount++
		case 2:
			twoCount++
		}
	}
	counter := 0
	for i := 0; i < zeroCount; i++ {
		nums[counter] = 0
		counter++
	}
	for i := 0; i < oneCount; i++ {
		nums[counter] = 1
		counter++
	}
	for i := 0; i < twoCount; i++ {
		nums[counter] = 2
		counter++
	}
	fmt.Println(nums)
}

输出

[0 0 1 1 2 2]

第二种方法--使用切换和洗牌

package main

import "fmt"

func main() {
	sortNums([]int{2, 0, 2, 1, 1, 0})
}

func sortNums(nums []int) {
	low := 0
	mid := 0
	high := len(nums) - 1

	for mid <= high {

		switch nums[mid] {
		case 0:
			nums[low], nums[mid] = nums[mid], nums[low]
			low++
			mid++
		case 1:
			mid++
		case 2:
			nums[mid], nums[high] = nums[high], nums[mid]
			high--
		}
	}
	fmt.Println(nums)
}

输出

[0 0 1 1 2 2]