Слияние сортированных подмассивов

Задача: реализовать MrgeSort

Я на этапе: Разделил массив на подмассивы и отсортировал эти подмассивы

Не получается: Соеденить отсортированные подмассивы.

Условие(это от меня условие, а не по задаче): Использовать только тот код что уже есть если это возможно(так как сам додумался как создать подмассивы и отсортировать их, хочется с ним и продолжить работать).

Код который я уже написал:

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    // создаю массив под начальные числа и
    // пустой массив под результат сортировки
    var anonsorted, asorted []int
    // заполняю начальный массив псевдорандомными числами.
    for i := 0; i < 20; i++ {
        anonsorted = append(anonsorted, rand.Intn(100))
    }
    asorted = divideAndSort(anonsorted, asorted)
    fmt.Println(asorted)
}

// алгоритм создает группы(под-под-массивы) и сразу сортирует числа внутри этих под-под-массивов
// не могу додуматься как эти группы сотрированных под-под-массивов соеденить.
func divideAndSort(adivided, asorted []int) []int {
    if len(adivided) == 1 {
        return adivided
    }
    divide := len(adivided) / 2
    left := 0
    for i := range adivided {
        if adivided[i] <= adivided[divide] {
            adivided[i], adivided[left] = adivided[left], adivided[i]
            left++
        }
    }
    // отсортированный подмассив от нулевого индекса до его опорного
    oneHalf := divideAndSort(adivided[:divide], asorted)
    // отсортированный подмассив от его опорного индекса до конца массива.
    twoHalf := divideAndSort(adivided[divide:], asorted)
    asorted = merge(oneHalf, twoHalf, asorted)
    return asorted
}

func merge(oneHalf, twoHalf, asorted []int) []int {
    //...
    //asorted = объединение oneHalf и twoHalf
    return asorted
}

UPD:

func merge(one, two, sorted []int) []int {
    i, j := 0, 0
    for i < len(one)-1 && j < len(two)-1 {
        if one[i] <= two[j] {
            sorted = append(sorted, one[i])
        } else {
            sorted = append(sorted, two[j])
        }
        i++
        j++
    }
    if i < len(one) {
        sorted = append(sorted, one...)
    }
    if j < len(two) {
        sorted = append(sorted, two...)
    }
    return sorted
}

Дает некорректный результат.

UPD2:

Нашел все ошибки.

1. перенес инкременты из цикла и условия
2. при выходе из цикла в уловиях сделал заполнение `sorted` 
от того индекса на котором завешился цикл а не от нулеого.
3. цикл сделал до len(array) а не до len(rray)-1

вот итоговый вариант merge().

func merge(one, two, sorted []int) []int {
    i, j := 0, 0
    for i < len(one) && j < len(two) {
        if one[i] <= two[j] {
            sorted = append(sorted, one[i])
            i++
        } else {
            sorted = append(sorted, two[j])
            j++
        }
    }
    if i < len(one) {
        //здесь была ошибка. Нужно было заполнять от того i
        //на котором закончился цикл а не от нулевого.
        sorted = append(sorted, one[i:]...)
    }
    if j < len(two) {
        //здесь была ошибка. Нужно было заполнять от того j
        //на котором закончился цикл а не от нулевого.
        sorted = append(sorted, two[j:]...)
    }
    return sorted
}

Ответы (1 шт):

Автор решения: MBo
пока ни один массив не дошел до конца 
   Если очередной элемент первого массива меньше или равен очередному элементу второго
      то записать на выход элемент из первого
  Иначе 
      записать из второго

если первый массив не кончился
    записать всё из него
если второй массив не кончился
    записать всё из него
→ Ссылка