Go语言数组排序代码报index out of range错误如何修复?
你出现索引越界的核心原因是Sorting函数内的内层循环边界计算错误:
Sorting函数中langkah初始值为0,原内层循环条件i < jumlahdata - (langkah-1)当langkah=0时,计算结果为i < jumlahdata +1,i最大值会取到jumlahdata,此时访问DataDiagram[i+1]等于访问切片索引为jumlahdata的位置,而切片最大索引只有jumlahdata-1,直接触发越界。- 冒泡排序每一轮会将当前最大的未排序元素移动到末尾,因此内层循环的边界应该是
i < jumlahdata - langkah - 1,既可以避免重复遍历已经排好序的尾部元素,也不会出现越界。
另外还有两处需要修正的细节:
- 代码中打印换行的写法
fmt.Print(" ")应该改为fmt.Print("\n"),Go中换行需要用转义字符\n - 外层声明的
mem变量没有实际作用,Sorting函数内部交换时又重新声明了局部mem变量,属于冗余代码可以直接删掉外层传参。
修复后的完整代码如下:
package main import "fmt" func main() { fmt.Print("请输入要录入的数据数量:") var jumlahdata int fmt.Scanln(&jumlahdata) var DataDiagram = make([]int, jumlahdata) fmt.Print("请依次输入数据,用空格分隔:") for i := 0; i < jumlahdata; i++ { fmt.Scanf("%d", &DataDiagram[i]) } fmt.Print("\n") var max int = DataDiagram[0] for _, value := range DataDiagram { // 查找数组最大值 if value > max { max = value } } Sorting(DataDiagram, jumlahdata, max) } func Grafik(jumlahdata int, max int, DataDiagram []int) { for i := max; i >= 1; i-- { // 生成排序过程柱状图 for j := 0; j < jumlahdata; j++ { if DataDiagram[j] >= i { fmt.Print(" | ") } else { fmt.Print(" ") } } fmt.Print("\n") } for i := 0; i < jumlahdata; i++ { fmt.Print("---") } fmt.Print("\n") fmt.Print(" ") for i := 0; i < jumlahdata; i++ { fmt.Print(DataDiagram[i], " ") } fmt.Print("\n\n") } func Sorting(DataDiagram []int, jumlahdata int, max int) { for langkah := 0; langkah < (jumlahdata - 1); langkah++ { Grafik(jumlahdata, max, DataDiagram) // 修正内层循环边界,避免索引越界 for i := 0; i < jumlahdata - langkah - 1; i++ { if DataDiagram[i] > DataDiagram[i+1] { mem := DataDiagram[i] DataDiagram[i] = DataDiagram[i+1] DataDiagram[i+1] = mem } } } // 排序完成后打印最终结果 Grafik(jumlahdata, max, DataDiagram) }
内容的提问来源于stack exchange,提问作者Panji Tri Wahyudi
相关产品推荐
相关产品推荐

