Слияние сортированных подмассивов
Задача: реализовать 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
→ Ссылка
пока ни один массив не дошел до конца
Если очередной элемент первого массива меньше или равен очередному элементу второго
то записать на выход элемент из первого
Иначе
записать из второго
если первый массив не кончился
записать всё из него
если второй массив не кончился
записать всё из него