英文:
what is wrong with go language code converted from equivalent python?
问题
我是你的中文翻译助手,以下是翻译好的内容:
我刚开始学习Go语言,并试图通过实践来学习。我尝试使用归并排序,但不知道哪里出了问题,结果不如预期。我相当确定问题与我使用的切片有关。
我将等效的python代码转换为go代码,Python代码可以正常工作,但是Go代码可能缺少了一些东西(可能是我对切片的理解)。
正常工作的Python代码如下:
def mergeSort(arr):
    if len(arr) > 1:
 
         # 找到数组的中间位置
        mid = len(arr)//2
 
        # 将数组分成两半
        L = arr[:mid]
 
        # 排序第一半
        mergeSort(L)
 
        # 排序第二半
        mergeSort(R)
 
        i = j = k = 0
 
        # 将数据复制到临时数组 L[] 和 R[]
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
 
        # 检查是否有剩余元素
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
 
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1
 
# 打印列表的代码
 
 
def printList(arr):
    for i in range(len(arr)):
        print(arr[i], end=" ")
    print()
# 主程序
arr = [457, 4, 0, 500, -8, 6, 5, -20, -93, 50, 5, 1, 6, 10, 54, 7, 13, 10, -5, 50, 500, 8, 4, -1, -99, 5, 0, 0, -899]
printList(mergeSort(arr))
转换为等效的Go代码:
package main
import "fmt"
func main() {
    intArr := []int{457, 4, 0, 500, -8, 6, 5, -20, -93, 50, 5, 1, 6, 10, 54, 7, 13, 10, -5, 50, 500, 8, 4, -1, -99, 5, 0, 0, -899}
    fmt.Println(mergeSort(intArr))
}
func mergeSort(arr []int) []int {
    if len(arr) > 1 {
        // 找到数组的中间位置
        mid := int(len(arr) / 2)
        // 将数组分成两半
        L := arr[:mid]
        // 排序第一半
        mergeSort(L)
        // 排序第二半
        mergeSort(R)
        i, j, k := 0, 0, 0
        // 将数据复制到临时数组 L[] 和 R[]
        for i < len(L) && j < len(R) {
            if L[i] < R[j] {
                arr[k] = L[i]
                i++
            } else {
                arr[k] = R[j]
                j++
            }
            k++
        }
        // 检查是否有剩余元素
        for i < len(L) {
            arr[k] = L[i]
            i++
            k++
        }
        for j < len(R) {
            arr[k] = R[j]
            j++
            k++
        }
    }
    return arr
}
但是Go代码的输出结果如下:
[-899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899]
英文:
I am new to Go Language and trying to learn it by doing.
tried with MergeSort but some how I am missing something and result is not as expected.
I am pretty sure it has something to do with slices I am using.
converted equivalent python code to go python works but go code missed something (in terms of my understanding to slice may be)
working Python Code
def mergeSort(arr):
    if len(arr) > 1:
 
         # Finding the mid of the array
        mid = len(arr)//2
 
        # Dividing the array elements
        L = arr[:mid]
 
        # into 2 halves
        R = arr[mid:]
 
        # Sorting the first half
        mergeSort(L)
 
        # Sorting the second half
        mergeSort(R)
 
        i = j = k = 0
 
        # Copy data to temp arrays L[] and R[]
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
 
        # Checking if any element was left
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
 
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1
 
# Code to print the list
 
 
def printList(arr):
    for i in range(len(arr)):
        print(arr[i], end=" ")
    print()
# Driver Code
arr = [457, 4, 0, 500, -8, 6, 5, -20, -93, 50, 5, 1, 6, 10, 54, 7, 13, 10, -5, 50, 500, 8, 4, -1, -99, 5, 0, 0, -899]
printList(mergeSort(arr))
 
Converted equivalent Go Code
package main
import "fmt"
func main() {
    intArr := []int{457, 4, 0, 500, -8, 6, 5, -20, -93, 50, 5, 1, 6, 10, 54, 7, 13, 10, -5, 50, 500, 8, 4, -1, -99, 5, 0, 0, -899}
    fmt.Println(mergeSort(intArr))
}
func mergeSort(arr []int) []int {
    if len(arr) > 1 {
        // Finding the mid of the array
        mid := int(len(arr) / 2)
        // Dividing the array elements
        L := arr[:mid]
        // into 2 halves
        R := arr[mid:]
        // Sorting the first half
        mergeSort(L)
        // Sorting the second half
        mergeSort(R)
        i, j, k := 0, 0, 0
        // Copy data to temp arrays L[] and R[]
        for i < len(L) && j < len(R) {
            if L[i] < R[j] {
                arr[k] = L[i]
                i++
            } else {
                arr[k] = R[j]
                j++
            }
            k++
        }
        // Checking if any element was left
        for i < len(L) {
            arr[k] = L[i]
            i++
            k++
        }
        for j < len(R) {
            arr[k] = R[j]
            j++
            k++
        }
    }
    return arr
}
but output is from Go code
[-899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899 -899]
答案1
得分: 1
数组切片在Go语言中不会分配新的数组。L、R和arr指的是同一个底层数组。
你可以使用"copy"函数来深度克隆切片:
func mergeSort(arr []int) []int {
    if len(arr) > 1 {        
        // 找到数组的中间位置
        mid := int(len(arr) / 2)        
        // 将数组分成两半
        L := make([]int, mid)
        copy(L, arr[:mid])        
        // into 2 halves
        R := make([]int, len(arr)-mid)
        copy(R, arr[mid:])        
        // 对第一半进行排序
        mergeSort(L)        
        // 对第二半进行排序
        mergeSort(R)        
        i, j, k := 0, 0, 0        
        // 将数据复制到临时数组L[]和R[]
        for i < len(L) && j < len(R) {
            if L[i] < R[j] {
                arr[k] = L[i]
                i++
            } else {
                arr[k] = R[j]
                j++
            }
            k++
        }        
        // 检查是否有剩余元素
        for i < len(L) {
            arr[k] = L[i]
            i++
            k++
        }        
        for j < len(R) {
            arr[k] = R[j]
            j++
            k++
        }
    }
    return arr
}
以上是对数组进行归并排序的示例代码。
英文:
Array slicing does not allocate new arrays in go. L, R and arr refers to the same underlying array.
You can use "copy" to deep clone the slice:
    func mergeSort(arr []int) []int {
if len(arr) > 1 {        
// Finding the mid of the array
mid := int(len(arr) / 2)        
// Dividing the array elements
L := make([]int, mid)
copy(L, arr[:mid])        
// into 2 halves
R := make([]int, len(arr)-mid)
copy(R, arr[mid:])        
// Sorting the first half
mergeSort(L)        
// Sorting the second half
mergeSort(R)        
i, j, k := 0, 0, 0        
// Copy data to temp arrays L[] and R[]
for i < len(L) && j < len(R) {
if L[i] < R[j] {
arr[k] = L[i]
i++
} else {
arr[k] = R[j]
j++
}
k++
}        
// Checking if any element was left
for i < len(L) {
arr[k] = L[i]
i++
k++
}        
for j < len(R) {
arr[k] = R[j]
j++
k++
}
}
return arr
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论