[本文出自天外归云的博客园]

构造二叉树解决这个排序问题,代码如下:
package pintia
import (
"strconv"
"strings"
)
// SortedNumber 具有排序属性的数字结构
type SortedNumber struct {
Self int
Left *SortedNumber
Right *SortedNumber
}
var sortedNumbers []string
// NumbersSort 将输入的任意n个整数从小到大输出
// 输入格式:输入在一行中给出n个整数,其间以空格分隔
// 输出格式:在一行中将n个整数从小到大输出,其间以“->”相连
func NumbersSort(threeNumsStr string) (sortedNumbersStr string) {
nums := strings.Split(threeNumsStr, " ")
intNumber, _ := strconv.Atoi(nums[0])
sortedNumber := SortedNumber{Self: intNumber}
for i := 1; i < len(nums); i++ {
intNumber, _ := strconv.Atoi(nums[i])
PutNumberOnTree(&sortedNumber, intNumber)
}
GetNumberOffTree(sortedNumber)
sortedNumbersStr = strings.Join(sortedNumbers, "->")
return
}
// GetNumberOffTree 把整数从树上摘下来
func GetNumberOffTree(sortedNumber SortedNumber) {
if sortedNumber.Left != nil {
GetNumberOffTree(*sortedNumber.Left)
}
sortedNumbers = append(sortedNumbers, strconv.Itoa(sortedNumber.Self))
if sortedNumber.Right != nil {
GetNumberOffTree(*sortedNumber.Right)
}
}
// PutNumberOnTree 把整数放到树上
func PutNumberOnTree(sortedNumber *SortedNumber, intNumber int) {
if intNumber >= sortedNumber.Self {
// fmt.Printf("%+v大于%+v
", intNumber, sortedNumber.Self)
if sortedNumber.Right == nil {
sortedNumber.Right = &SortedNumber{
Self: intNumber,
}
} else {
PutNumberOnTree(sortedNumber.Right, intNumber)
}
} else {
// fmt.Printf("%+v小于%+v
", intNumber, sortedNumber.Self)
if sortedNumber.Left == nil {
sortedNumber.Left = &SortedNumber{
Self: intNumber,
}
} else {
PutNumberOnTree(sortedNumber.Left, intNumber)
}
}
}
其中先后用到的思想是:
1. PutNumberOnTree 数上树(按规则上树)
2. GetNumberOffTree 树摘数(按规则下树)
单测:
package pintia
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestThreeNumbersSort(t *testing.T) {
// 准备待测数据
var numbersStr = "-1 -4 -2 9 -999 8 0 6 4 5 3 2 1 7 8 9 9 100"
var expectStr = "-999->-4->-2->-1->0->1->2->3->4->5->6->7->8->8->9->9->9->100"
// 执行待测方法
sortedNumberStr := NumbersSort(numbersStr)
t.Log(sortedNumberStr)
// 断言
assert := assert.New(t)
assert.Equal(expectStr, sortedNumberStr, "排序错误")
}
测试脚本:
method=$1 fileList=`ls` cmd="go test -v" for file in $fileList do if echo "$file" | grep -q -E '.go$';then cmd="${cmd} $file" fi done cmd="$cmd -test.run $method -gcflags=-l" $cmd
运行脚本命令:
sh exec_test.sh TestThreeNumbersSort
测试结果:
