Questa è una domanda sui compiti a casa, quindi vorrei evitare risposte complete e molto preferire suggerimenti se possibile.Un algoritmo di ordinamento O (n)
Dato un array di numeri casuali A [1 ... x], il programma deve restituire i primi elementi dell'array y in ordine crescente dove 1 < = y < = sqrt (x). Quindi, fondamentalmente, dato un array [5,9,2,8] y = 2, il programma dovrebbe restituire [2,5].
La risposta "ordina prima, restituisci prima articoli" è fuori dalla finestra poiché il meglio che possiamo fare è n * tempo logn con fusione o quicksort. La risposta deve quindi sfruttare il fatto che restituiamo solo al massimo gli elementi sqrt (x), e l'unica altra risposta che ho finora è fare una ricerca for-loop per l'elemento minimo dell'array, rimuovendo il minimo da l'array, stashing in una nuova matrice, dire B, e ripetendo il processo della versione ora più piccolo modificata di a di lunghezza x-1, che ci dà tempo di esecuzione in questo modo:
x + (x-1) + (x-2) + ... + (x-y)
che conta il numero di iterazione for-loop della ricerca min e ci dà al massimo y o sqrt (x) iterazioni nello scenario peggiore, e ci sono al massimo x elementi nell'array. Quindi abbiamo sqrt (x) * x, che è migliore di O (n * logn) ma non è ancora abbastanza O (n): /.
Hai guardato [bucket sort] (http://en.wikipedia.org/wiki/Bucket_sort)? Quando vedo i requisiti O (n) è l'unica cosa che mi viene in mente. –
"il programma dovrebbe restituire il primo y * numero *". Forse * numeri *? – ruslik
@ruslki - sì, intendevo i primi elementi dell'array y. Correggendolo adesso. – thezhaba