为了账号安全,请及时绑定邮箱和手机立即绑定

如何对数组进行排序

如何对数组进行排序

Go
茅侃侃 2022-10-10 16:52:56
我在 Go 中对数组进行排序时遇到问题,这是我的代码:func main() {    fmt.Print("Masukkan Jumlah Data yang akan dimasukkan: ")    var jumlahdata int    fmt.Scanln(&jumlahdata)    var DataDiagram = make([]int, jumlahdata)    fmt.Print("Masukkan data secara berurutan dengan spasi sebagai pemisah antar angka: ")    for i := 0; i < jumlahdata; i++ {        fmt.Scanf("%d", &DataDiagram[i])    }    fmt.Print("\n")    var max int = DataDiagram[0]    for _, value := range DataDiagram { // Menemukan nilai maximum        if value > max {            max = value        }    }    var mem int    Sorting(DataDiagram, jumlahdata, mem, max)}func Grafik(jumlahdata int, max int, DataDiagram []int) {    for i := max; i >= 1; i-- { // membuat Data Diagram        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], "  ")    }}func Sorting(DataDiagram []int, jumlahdata int, mem 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;            }        }    }}我期待的是这样的: 我期待什么但是输出另有说明,它给了我错误:它给了我错误有人可以提供一些指导如何解决这个问题:) 我昨天刚学 Go,它类似于 C,但一直给我 index out of range 错误
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

我了解您的任务是对int“数组”(slice,通俗地说)进行排序,将您工作的每个步骤显示为图表。因为你必须展示你的工作,所以你不能使用 go 的内置排序,例如sort.Ints(DataDiagram).

您的问题与Sorting功能有关。

第 1 步您直接导致崩溃的问题是i最终迭代到大于上索引的数字DataDiagram。我们在下面的注释行中修复。

// Step 1: fix the iterator

func Sorting(DataDiagram []int, jumlahdata int, mem int, max int) {

    for langkah := 0; langkah < (jumlahdata-1) ; langkah++ {

        Grafik(jumlahdata, max, DataDiagram)

        for i := 0; i < jumlahdata - 1; i++ { // Was: 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;

            }

        }

    }

}

步骤 2代码不再崩溃,但不能保证排序,因为它只通过输入一次。我们需要继续循环,直到不再发生交换。这个问题在下面得到解决。代码现在在操场上产生预期的输出。


// Step 2: loop until sorted

func Sorting(DataDiagram []int, jumlahdata int, mem int, max int) {

    swapped := true


    for swapped {

        Grafik(jumlahdata, max, DataDiagram)

        swapped = false

        for i := 0; i < jumlahdata - 1; i++ {

            if DataDiagram[i] > DataDiagram[i + 1] {

                mem := DataDiagram[i];

                DataDiagram[i] = DataDiagram[i + 1]

                DataDiagram[i + 1] = mem;

                swapped = true

            }

        }

    }

}

第 3 步上面的代码工作正常,但也许可以使用一些整理。最终结果在操场上没有改变。


// Step 3: make it prettier

func Sorting(data []int) {


    max := data[0]


    for _, value := range data { // Menemukan nilai maximum

        if value > max {

            max = value

        }

    }


    swapped := true


    for swapped {

        Grafik(len(data), max, data)

        swapped = false

        for i := 0; i < len(data)-1; i++ {

            if data[i] > data[i+1] {

                data[i], data[i+1] = data[i+1], data[i]

                swapped = true

            }

        }

    }

}


查看完整回答
反对 回复 2022-10-10
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

如果您只使用 sort.Ints(ints) 会简单得多,您可以在此处看到: https ://goplay.space/#i9VIrDG-vL-


查看完整回答
反对 回复 2022-10-10
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信