2014-06-30 14 views
5

Sto imparando Go e ho provato a implementare un quicksort, tuttavia non restituisce un elenco completo. Per la mia comprensione di Go corrisponde a un'implementazione di Ruby funzionante che ho scritto.Quicksort in Go

Il mio codice è:

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 
    } 
} 

Sono molto perplesso su ciò che in questo non funziona.

+2

Non capisco perché questo era giù votato, è una domanda legittima. – OneOfOne

+1

rispetto a [tex.se], dove ero molto attivo, c'è una tendenza qui a sviare rapidamente le domande :( – topskip

+0

Mi manca così prima che le mod diventassero un governo fascista, mi ricorda '/ r/technology ' – OneOfOne

risposta

6

Il bug che si ha è che non si aggiunge mai il valore pivot alla slice restituita. Quindi per ogni chiamata ricorsiva, perderai il pivot.

apportare la seguente modifica al codice e funzionerà:

equal := make([]string, 1, len(data)) 
equal[0] = pivot 
+0

Sigh. Sapevo che era qualcosa di dolorosamente ovvio – javanut13

+0

Pickup molto bello Sto ancora cercando di seguire algoritmica-roba in Go. Questo ha aiutato :) –