О… как много в этом «чпоке»!.. Сортировать «пузырьком» нас учили еще в школе. Почему бы не замутить код этой сортировки на Го? 😀 И пусть она редко оказывается полезной — это весьма годное упражнение для начинающих.
Наша программа будет принимать на ввод строку целых чисел, разделенных пробелами, преобразует их в срез (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» теперь отсортирован. Аллилуйа!