Язык Go. Сортировка пузырьком


О… как много в этом «чпоке»!.. Сортировать «пузырьком» нас учили еще в школе. Почему бы не замутить код этой сортировки на Го? 😀 И пусть она редко оказывается полезной — это весьма годное упражнение для начинающих.

Наша программа будет принимать на ввод строку целых чисел, разделенных пробелами, преобразует их в срез (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» теперь отсортирован. Аллилуйа!


Запись опубликована в рубрике Go. Добавьте в закладки постоянную ссылку.

Добавить комментарий

🇬🇧 Attention! Comments with URLs/email are not allowed.
🇷🇺 Комментарии со ссылками/email удаляются автоматически.