Как отсортировать массив

# #arrays #sorting #go

Вопрос:

У меня проблема с сортировкой моего массива в Go, вот мой код :

 func main() {
    fmt.Print("Masukkan Jumlah Data yang akan dimasukkan: ")
    var jumlahdata int
    fmt.Scanln(amp;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", amp;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

Комментарии:

1. было бы проще обсудить ваш код, если бы он не ожидал ввода пользователем. Для целей этого запроса замените ваши fmt.Scan* вызовы жестко закодированными данными. Включите также пример желаемого результата в текстовой форме, как если бы программа выводила его.

2. извините за это, я только что отредактировал: 3

Ответ №1:

Я понимаю, что ваша задача состоит в том, чтобы отсортировать int «массив» (срез, в go-speak), показывая каждый шаг вашей работы в виде графика. Поскольку вы должны показать свою работу, вы не можете использовать встроенную сортировку 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
            }
        }
    }
}
 

Комментарии:

1. Спасибо за вашу помощь!, было любопытно, в чем была моя проблема. Теперь все хорошо, спасибо!!

Ответ №2:

Было бы намного проще, если бы вы просто использовали сортировку.Целые числа (ints), которые вы можете увидеть здесь: https://goplay.space/#i9VIrDG-vL —