To jest zadanie domowe, więc chciałbym uniknąć pełnych odpowiedzi i dużo preferować wskazówki, jeśli to możliwe.An (n) algorytm sortowania
Biorąc pod uwagę tablicę losowych liczb całkowitych A [1 ... x], program powinien zwrócić pierwsze elementy tablicy y w rosnącej kolejności, gdzie 1 < = y < = sqrt (x). Zasadniczo, biorąc pod uwagę tablicę [5,9,2,8] i y = 2, program powinien powrócić [2,5].
Odpowiedź "sortuj pierwszy, zwróć pierwsze rzeczy" jest niedostępna, ponieważ najlepsze, co możemy zrobić, to n * czas logowania z łączeniem lub quicksort. Odpowiedź zatem musi polegać na tym, że zwracamy tylko co najwyżej sqrt (x), a jedyną inną odpowiedzią, jaką mam do tej pory, jest wyszukiwanie w pętli minimalnego elementu w tablicy, usunięcie minimum z tablica, stashing go w nowej tablicy, powiedzieć B, i powtarzając proces na teraz mniejszej wersji zmodyfikowanej od a o długości X-1, co daje nam czas działa tak:
x + (x-1) + (x-2) + ... + (x-y)
to zlicza iteracji pętli for min-search i daje nam co najwyżej y lub sqrt (x) iteracji w najgorszym scenariuszu i jest co najwyżej x pozycji w tablicy. Mamy więc sqrt (x) * x, który jest lepszy niż O (n * logn), ale wciąż nie całkiem O (n): /.
Czy obejrzałeś [bucket sort] (http://en.wikipedia.org/wiki/Bucket_sort)? Kiedy widzę O (n) wymagania, to jedyna rzecz, która przychodzi mi do głowy. –
"program powinien zwrócić pierwsze y * cyfry *". Może * liczby *? – ruslik
@ruslki - tak, miałem na myśli pierwsze elementy tablicy y. Napraw to teraz. – thezhaba