Быстрая сортировка в Go

#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. Это помогло 🙂