Naiwny algorytm ustalania B od A:
Dla k=1,…,n, określ wartość B(k) przez porównanie każdego z nich A(i) do A(k) dla
i=1,…,k i licząc tych, którzy spełniają A(i)<A(k).
Ten algorytm się porównuje A(1) dla wszystkich innych (n−1 czasy), A(2) do n−2 inne itp., więc łączna liczba porównań wynosi (n−1)(n−2)2. Ale to nie najlepsze, co możemy zrobić. Na przykład patrzącB ( n ), nie musimy dokonywać żadnych porównań! B ( n ) = A ( n ) - 1ponieważ to pierwszy n liczby naturalne i jest gwarantowane (niezależnie od permutacji), że n - 1będą tam niższe liczby naturalne. Co powiesz naB ( n - 1 )? Zamiast sprawdzaćA ( 1 ) przez A ( n - 2 ), moglibyśmy po prostu sprawdzić A ( n ). To jest:
Dla k = 1 , … ,n2), użyj powyższego algorytmu; dla
k =n2), … , N użyj algorytmu odwrotnego: ustal B ( k ) ustawiając go początkowo na A ( n ) - 1 a następnie odejmowanie 1 dla każdego wpisu A ( i ) dla i = k + 1 , … , n to mniej niż A ( k ).
To zajmie 2 ×(n2)- 1 ) (n2)- 2 )2)=( n - 2 ) ( n - 4 )4 kroki, które są nadal O (n2)). Zauważ też, że przy konstruowaniuZA od b, gdyby B ( n ) = A ( n ) - 1 następnie A ( n ) = B ( n ) + 1.
Ale teraz więcej finezji. Jeśli otrzymamy dodatkowe miejsce lub sortujemy w miejscu, możemy sortować liczby, porównując je. Na przykład:
∣∣∣∣ZAS.b8904803)7014073)3)2)2)19166655∣∣∣∣
Zamiast sprawdzać je wszystkie (lub sprawdzać je w kolejności), możemy użyć wyszukiwania binarnego, aby ustalić każde z nich B ( k ). Jednak sortowanie wciąż wymaga czasuO ( n logn ).