简体   繁体   English

如何在 Go 语言中对数组进行排序?

[英]How to sort array in Go Language?

So i have problem for sorting my array in Go Lang, Here is my code :所以我在 Go Lang 中对数组进行排序时遇到问题,这是我的代码:

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;
            }
        }
    }
}

What i expect is look like this: What I Expect我所期望的是这样的:我所期望的

But the output said otherwise, it give me error : It give me error但输出另有说明,它给我错误:它给我错误

Can someone give some guide how to fix this :) i just learn Go yesterday, it similiar to C, but keep giving me index out of range error有人可以提供一些指导如何解决这个问题:) 我昨天刚学了 Go,它类似于 C,但一直给我索引超出范围错误

I understand your task is to sort an int "array" ( slice , in go-speak), showing each step of your work as a graph.我知道您的任务是对一个int “数组”( slice ,用 go-speak )进行排序,将您工作的每一步都显示为图表。 Because you must show your work, you can't use go's built-in sorting, eg sort.Ints(DataDiagram) .因为你必须展示你的作品,所以你不能使用 go 的内置排序,例如sort.Ints(DataDiagram)

Your problems are with the Sorting function.您的问题与Sorting功能有关。

Step 1 Your immediate crash-causing problem is that i eventually iterates to a number larger than upper index of DataDiagram .第 1 步直接导致崩溃的问题是i最终迭代到一个大于DataDiagram上索引的数字。 That we fix in the commented line below.我们在下面的注释行中修复。

// 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;
            }
        }
    }
}

Step 2 The code no longer crashes, but is not guaranteed to sort, because it makes only one pass through the inputs.步骤 2代码不再崩溃,但不能保证排序,因为它只通过输入一次。 We need to continue looping until there's no more swapping taking place.我们需要继续循环直到不再发生交换。 That problem is fixed below.该问题已在下面修复。 The code now produces the expected output on the playground.代码现在在操场上产生预期的输出

// 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
            }
        }
    }
}

Step 3 The above code works fine, but perhaps can use some tidying.步骤 3上面的代码工作正常,但也许可以使用一些整理。 The end result is unchanged on the playground .最终结果在操场上没有改变。

// 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
            }
        }
    }
}

如果你只使用 sort.Ints(ints) 就简单多了,你可以在这里看到: https ://goplay.space/#i9VIrDG-vL-

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM