我是新手。我正在使用go version go1.10.4 linux/amd64
。我的目标是要求用户输入单个整数并将其附加到数组中并对其进行排序。我为此使用插入排序。该程序需要在收到来自用户的'X'
作为输入时退出。
这是我的代码:
package main
import (
"fmt"
"strconv"
// "sort"
)
func insertionSort(arr []int) []int {
// Traverse through 1 to len(arr)
for i, _ := range arr[1:] {
key := arr[i]
j := i - 1
for {
if j >= 0 && key < arr[j] {
arr[j+1] = arr[j]
j = j - 1
} else {
break
}
}
arr[j+1] = key
}
return arr
}
func main() {
s := make([]int, 0, 3)
var x string
for {
fmt.Printf("Enter a number: ")
fmt.Scan(&x)
if x == "X" {
break
}
xInt, _ := strconv.Atoi(x)
fmt.Println(xInt)
s = append(s, xInt)
//sort.Ints(s)
s = insertionSort(s)
fmt.Printf("%v\n", s)
}
fmt.Printf("%v\n", s)
}
我得到以下输出:
Enter a number: 5
[5]
Enter a number: 4
[5 4]
Enter a number: 3
[4 5 3]
Enter a number: 2
[3 4 5 2]
Enter a number: 1
[2 3 4 5 1]
Enter a number: X
[2 3 4 5 1]
Question:
为什么第二遍排序?我的意思是,它首先打印附加数组,然后打印下一个元素,然后打印前一个元素的排序数组。为什么?我在追加后进行排序,因此情况并非如此...
我从here提取了插入排序代码(并从Python
代码转换了
答案 0 :(得分:4)
您的for循环是错误的。当您执行for i,_ := range arr[1:]{
时, i变为0,而不是1。您想开始使用pos 1从第二个元素开始遍历数组,但是当您执行arr[1:]
时,您的数组发生变化,成为元素少一个的切片,而您的索引最终仍为0。
要解决此问题,请检查发布页面中的c ++代码,并实现可在原始数组长度上运行的for循环。
range arr
与其他语言中的foreach
类似,因此很难使用索引进行操作。
注意:我还检查了页面的python代码。它还为python代码提供了一个for循环。长话短说,请谨慎使用range arr[1:]
:)
修复:
for i, _ := range arr[1:]
=>for i:=1;i<len(arr);i++
它带有扰流标签,因为我不想窃取您修复错误的乐趣。