#go #quicksort
#Вперед #быстрая сортировка
Вопрос:
Я изучаю Go и попытался реализовать быструю сортировку, однако она не возвращает полный список. Насколько я понимаю, Go соответствует функционирующей реализации Ruby, которую я написал.
Мой код:
func quickSort(data []string) []string {
if len(data) > 1 {
pivot := data[0]
smaller := make([]string, 0, len(data))
equal := make([]string, 0, len(data))
larger := make([]string, 0, len(data))
for i := 1; i < len(data); i {
if data[i] > pivot {
larger = append(larger, data[i])
} else if data[i] < pivot {
smaller = append(smaller, data[i])
} else {
equal = append(equal, data[i])
}
}
return append(append(quickSort(smaller), equal...), quickSort(larger)...)
} else {
return data
}
}
Я очень озадачен тем, что в этом не работает.
Комментарии:
1. Не уверен, почему это было отклонено, это законный вопрос.
2. по сравнению с TeX — LaTeX , где я раньше был очень активным, здесь наблюдается тенденция быстро отклонять вопросы: (
3. Я скучаю по SO до того, как моды превратили его в фашистское правительство, напоминает мне
/r/technology
.
Ответ №1:
Ошибка, с которой вы сталкиваетесь, заключается в том, что вы никогда не добавляете сводное значение к возвращаемому фрагменту. Таким образом, для каждого рекурсивного вызова вы потеряете сводную точку.
Внесите следующие изменения в код, и он будет работать:
equal := make([]string, 1, len(data))
equal[0] = pivot
Комментарии:
1. Вздох. Я знал, что это было что-то болезненно очевидное.
2. Очень хороший пикап. Я все еще пытаюсь следовать алгоритмическому материалу в Go. Это помогло 🙂