任务:实现MergeSort
我现在的阶段是:将数组划分为子数组并对这些子数组进行排序
不能:连接已排序的子数组。
条件(这是我的条件,而不是根据任务):如果可能的话,仅使用已经存在的代码(因为我自己弄清楚了如何创建子数组并对它们进行排序,所以我想继续使用它)。
我已经写的代码:
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
}
更新:
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
}
给出不正确的结果。
更新2:
我发现了所有的错误。
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 个回答