package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"sync"
)

func Swap(sli []int, i int) {
	sli[i], sli[i+1] = sli[i+1], sli[i]
}

func BubbleSort(sli []int, wg *sync.WaitGroup) {
	fmt.Println(sli)
	swapped := true
	for limit := len(sli) - 1; limit > 0 && swapped == true; limit-- {
		swapped = false
		for i := 0; i < limit; i++ {
			if sli[i] > sli[i+1] {
				Swap(sli, i)
				swapped = true
			}
		}
	}
	wg.Done()
}

func Merge(sli1, sli2 []int) []int {
	sorted := make([]int, 0, len(sli1)+len(sli2))
	i, j := 0, 0
	for i < len(sli1) && j < len(sli2) {
		if sli1[i] < sli2[j] {
			sorted = append(sorted, sli1[i])
			i++
		} else {
			sorted = append(sorted, sli2[j])
			j++
		}
	}
	if i < len(sli1) {
		sorted = append(sorted, sli1[i:]...)
	} else {
		sorted = append(sorted, sli2[j:]...)
	}
	return sorted
}

func main() {
	var seq []int
OuterLoop:
	for seq == nil {
		scanner := bufio.NewScanner(os.Stdin)
		fmt.Println(
			"Type in a sequence of space-separated integers:",
		)
		scanner.Scan()
		input := strings.Fields(scanner.Text())

		for _, value := range input {
			num, err := strconv.Atoi(value)
			if err != nil {
				fmt.Printf("Invalid input: %q\n", value)
				continue OuterLoop
			} else {
				seq = append(seq, num)
			}
		}
	}
	a := seq[:len(seq)/2]
	b := seq[len(seq)/2:]
	a1 := a[:len(a)/2]
	a2 := a[len(a)/2:]
	b1 := b[:len(b)/2]
	b2 := b[len(b)/2:]

	var wg sync.WaitGroup
	wg.Add(4)
	go BubbleSort(a1, &wg)
	go BubbleSort(a2, &wg)
	go BubbleSort(b1, &wg)
	go BubbleSort(b2, &wg)
	wg.Wait()

	a = Merge(a1, a2)
	b = Merge(b1, b2)
	fmt.Println(strings.Trim(fmt.Sprint(Merge(a, b)), "[]"))
}
