О… как много в этом «чпоке»!.. Сортировать «пузырьком» нас учили еще в школе. Почему бы не замутить код этой сортировки на Го? 😀 И пусть она редко оказывается полезной — это весьма годное упражнение для начинающих.
Наша программа будет принимать на ввод строку целых чисел, разделенных пробелами, преобразует их в срез (slice) целых чисел и отсортирует этот срез по возрастанию.. Код:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
r := bufio.NewReader(os.Stdin)
strInput, _ := r.ReadString('\n')
strInput = strings.TrimSpace(strInput)
strSlice := strings.Split(strInput, " ")
var nums []int
for _, v := range strSlice {
num, _ := strconv.Atoi(v)
nums = append(nums, num)
}
// Bubble sort
// 1) Compare two adjacent values
// 2) swap them it lowest value stays at right position
// 3) continue until there won't be any swaps
for {
ready := true
for i := 0; i < len(nums)-1; i++ {
if nums[i] > nums[i+1] {
nums[i], nums[i+1] = nums[i+1], nums[i]
ready = false
}
}
if ready {
break
}
}
fmt.Println(nums)
}
Итак, что тут у нас..
Как обычно, мы импортируем множество пакетов, включая «bufio» для чтения ввода, «fmt» для вывода, «os» для доступа к системной информации, «strconv» для преобразования строк в целые числа и «strings» для работы со строками.
Далее мы дичайше пишем функцию main, которая начинается с создания нового буферизованного читателя «r» — он считывает данные со стандартного ввода с помощью пакета «os».
В итоге наш ввод считывается как строка и присваивается переменной «strInput». Тут мы юзаем пакет «strings» для удаления из входной строки пробелов.
Потом мы умело разбиваем строку на отдельные целые числа с помощью шикарной функции «strings.Split()», и каждое целое число хранится как зеница ока в виде строки в срезе под названием «strSlice».
Далее вооружившись функцией «strconv.Atoi()» мы преобразуем каждую строку в «strSlice» в целое число, которое затем добавляется в новенький фрагмент под названием «nums».
Ок. Настало время расчехлить пушку нашей пузырьковой сортировки… Мы закукоживаем наш внешний цикл в бЭсконэчность и тамже выдвигаем мудрое предположение, что срез еще не отсортирован (выставляя флаг «ready» в true). Внутренний цикл выполняет итерации по срезу «nums», сравнивая каждую пару соседних целых чисел. Если текущее целое число больше следующего, то они меняются местами, а переменная ready устанавливается в false. Вот она, уличная магия, в рот-мне-ноги!
В конце-концов, если внешний цикл завершается без замены целых чисел, переменная ready остается равной true — тогда цикл прерывается, указывая на то, что срез «nums» теперь отсортирован. Аллилуйа!
