Наївний алгоритм визначення B з A:
Для k=1,…,n, визначте значення B(k) шляхом порівняння кожного A(i) до A(k) для
i=1,…,k і рахувати тих, що задовольняють A(i)<A(k).
Цей алгоритм порівнює A(1) всім іншим (n−1 разів), A(2) до n−2 інші тощо, тому загальна кількість порівнянь становить (n−1)(n−2)2. Але це не найкраще, що ми можемо зробити. Наприклад, дивлячись наB(n), ми не повинні робити ніяких порівнянь! B(n)=A(n)−1бо це перше n натуральні числа, і гарантовано (незалежно від перестановки), що n−1нижчі натуральні числа будуть там. А як на рахунокB(n−1)? Замість перевіркиA(1) наскрізь A(n−2), ми могли просто перевірити A(n). Це є:
Для k=1,…,n2, використовувати алгоритм, наведений вище; для
k=n2,…,n використовувати зворотний алгоритм: визначити B(k) встановивши його спочатку на A(n)−1 а потім віднімання 1 для кожного запису A(i) для i=k+1,…,n що менше, ніж A(k).
Це займе 2×(n2−1)(n2−2)2=(n−2)(n−4)4 кроки, що досі O(n2). Зауважимо також, що при конструюванніA з B, якщо B(n)=A(n)−1 тоді A(n)=B(n)+1.
Але тепер для більшої витонченості. Якщо нам дозволено додаткове місце або сортувати на місці, ми можемо сортувати числа, порівнюючи їх. Наприклад:
∣∣∣∣ASB8904803701407332219166655∣∣∣∣
Замість того, щоб перевіряти їх усіх (або перевіряти їх по порядку), ми могли б використовувати двійковий пошук для визначення кожного B(k). Однак сортування все ж потребує часуO(nlogn).