È importante ricordare che il punto del capitolo (e del libro) era come decostruire il problema per trovare una soluzione ottimizzata per i suoi vincoli, non come ordinare dati arbitrari. In quanto tale, l'esempio che usa qsort
è un throwaway.
Tuttavia, è scritto molto male, anche dal punto di vista degli anni '70; Immagino che l'incarico sia stato affidato a uno degli studenti di Bentley. Ecco alcuni dei problemi:
- Dimensione errata dell'array. Questo potrebbe essere stato risolto utilizzando una costante. Anche se vedi sotto.
- Mix di preoccupazioni: la lettura, l'ordinamento e la scrittura sono tre cose diverse e devono essere gestite da tre diverse funzioni. OK, questo è il dogma del 21 ° secolo, quindi forse Bentley o il suo studente possono essere perdonati. Nasconde ancora il core
qsort
in molte letture e scritture superflue.
- La funzione di confronto non sarà valida per le combinazioni degli interi minimi e massimi. Un confronto corretto deve prestare attenzione al bit di trasporto. Si potrebbe sostenere che il testo applica un vincolo di "interi positivi", ma in tal caso la funzione dovrebbe essere denominata
posintc
(sto mantenendo fino a 7 caratteri perché ricordo questo come un precoce requisito di linker * nix; un programmatore moderno dovrebbe usare il compare_positive_ints_by_ref
molto più lungo ma più descrittivo.
- Nessun controllo dei limiti: il lettore legge fino alla fine del file, e se lo dai più di 1.000.000 di voci supereranno felicemente il buffer. Questo è il problema più grande di IMO.
Detto questo, stai anche iniettando i tuoi requisiti. Ecco la dichiarazione del problema, da pagina 7 della 2a edizione, 20esima stampa:
If memory were not scarce, how would you implement a sort in a language with libraries for representing and sorting sets?
È vero, il testo parla di un file più grande. Ma questo non è esplicitamente menzionato nel problema. E i programmatori IMO aggiungendo quello che pensano siano requisiti è un grosso problema con il nostro settore.