Jak mogę posortować listę 5 liczb całkowitych tak, że w najgorszym przypadku potrzeba 7 porównań? Nie obchodzi mnie, ile innych operacji zostanie wykonanych. Nie wiem nic szczególnego o liczbach całkowitych.
Wypróbowałem kilka różnych metod dzielenia i podbijania, które obniżają mnie do 8 porównań, takich jak stosowanie podejścia scalesort lub łączenie scalesort z wykorzystaniem wyszukiwania binarnego w celu znalezienia pozycji wstawiania, ale za każdym razem, gdy kończę z 8, porównuje najgorszy przypadek .
W tej chwili szukam tylko wskazówki, a nie rozwiązania.
algorithms
sorting
Robert S. Barnes
źródło
źródło
if(x > y)
to to samo,if((x - y) & 0x80)
co trudno porównać. Chyba powinniśmy zapomnieć, że obiekty są liczbami całkowitymi i zakładamy, że musimy użyć jakiejś magicznejcompare(x, y)
funkcji, aby porównać te obiekty ...Odpowiedzi:
Jest tylko jeden sposób na rozpoczęcie tego procesu (i dla prawie wszystkich twoich decyzji dotyczących porównania w późniejszych krokach jest tylko jedna poprawna). Oto jak to rozgryźć. Po pierwsze, pamiętaj, że możesz uzyskać możliwych odpowiedzi do porównań i różnych kombinacji, w których musisz rozróżnić.5 ! = 1202)7= 128 5 ! = 120
Pierwsze porównanie jest łatwe: musisz porównać dwa klucze, a ponieważ nic o nich nie wiesz, wszystkie opcje są równie dobre. Więc powiedzmy, że porównanie i , a okaże się, że . Masz teraz możliwych odpowiedzi i pozostało możliwych permutacji (ponieważ wyeliminowaliśmy połowę z nich).b a ≤ b 2 6 = 64 60za b a ≤ b 2)6= 64 60
Następnie możemy albo porównać i , lub możemy porównać do jednego z klawiszy używaliśmy w pierwszej porównania. Jeśli porównamy i , i dowiedzieć się, że , wtedy mamy pozostałe odpowiedzi i możliwych permutacji. Z drugiej strony, jeśli porównamy z , i odkryjemy, że , mamy możliwych permutacji, ponieważ wyeliminowaliśmy możliwych permutacji (te z ) . Mamy tylkod c c d c ≤ d 32 30 C ≤ C 40 1 / 3 C ≤ ≤ b 32do re do do re c ≤ d 32 30 do za a ≤ c 40 1 / 3 c ≤ a ≤ b 32 możliwe pozostałe odpowiedzi, więc nie mamy szczęścia.
Teraz wiemy, że musimy porównać pierwszy i drugi klucz oraz trzeci i czwarty klucz. Możemy założyć, że mamy i . Jeśli porównamy do któregokolwiek z tych czterech kluczy, tym samym argumentem, którego użyliśmy w poprzednim kroku, możemy wyeliminować tylko pozostałych permutacji i nie mamy szczęścia. Musimy więc porównać dwa klucze . Biorąc pod uwagę symetrię, mamy dwie możliwości: porównaj i lub porównaj i . Podobny argument zliczania pokazuje, że musimy porównać i . Możemy założyć, że bez utraty ogólności, żec ≤ d e 1 / 3 , b , c , d C do D C ≤ C ≤ b ≤ C ≤ da ≤ b c ≤ d mi 1 / 3 a , b , c , d za do za re za do a ≤ c , a teraz mamy oraz .a ≤ b a ≤ c ≤ d
Ponieważ poprosiłeś o podpowiedź, nie omówię reszty argumentu. Pozostały ci cztery porównania. Używaj ich mądrze.
źródło
Można to znaleźć w The Art of Computer Programming vol. III autorstwa D.Knuth, ale strategia jest następująca (zakładam, że masz tablicę ): Jeśli chcesz przeczytać podpowiedź tylko dwie pierwsze linijki mojej odpowiedzi{a,b,c,d,e}
Wszystkie wyżej wymienione sposoby powodują najwyżej trzy porównania po pierwszym porównaniu z c . (co najwyżej 7).e c
źródło