Anda dapat melakukannya di O(n)( di mana njumlah digit) seperti ini:
Mulai dari kanan, Anda menemukan pasangan digit pertama sehingga digit kiri lebih kecil dari digit kanan. Mari merujuk digit kiri dengan "digit-x". Temukan angka terkecil lebih besar dari digit-x di sebelah kanan digit-x, dan letakkan segera di sebelah kiri digit-x. Akhirnya, urutkan digit yang tersisa dalam urutan menaik - karena mereka sudah dalam urutan menurun , yang perlu Anda lakukan adalah membalikkannya (simpan untuk digit-x, yang dapat ditempatkan di tempat yang benar di O(n)) .
Contoh akan membuat ini lebih jelas:
123456784987654321
mulai dengan angka
123456784 987654321
^ tempat pertama dari kanan di mana digit kiri kurang dari kanan
Digit "x" adalah 4
123456784 987654321
^ temukan digit terkecil lebih besar dari 4 ke kanan
123456785 4 98764321
^ letakkan di sebelah kiri 4
123456785 4 12346789
123456785123446789
^ urutkan digit ke kanan 5. Karena semuanya kecuali
'4' sudah dalam urutan menurun, yang perlu kita lakukan adalah
membalikkan pesanan mereka, dan menemukan tempat yang tepat untuk '4'
Bukti kebenaran:
Mari kita gunakan huruf kapital untuk mendefinisikan digit-string dan huruf kecil untuk digit. Sintaks ABberarti "rangkaian string Adan B" . <adalah pemesanan leksikografis, yang sama dengan pemesanan integer ketika digit-string memiliki panjang yang sama.
Nomor asli N kami adalah dalam bentuk AxB, di mana xsatu digit dan Bdiurutkan menurun.
Angka yang ditemukan oleh algoritma kami adalah AyC, di mana y ∈ Bdigit terkecil > x (harus ada karena cara xitu dipilih, lihat di atas) , dan Cdiurutkan naik.
Asumsikan ada beberapa nomor (menggunakan angka yang sama) N'sehingga AxB < N' < AyC. N'harus dimulai dengan Aatau tidak bisa jatuh di antara mereka, sehingga kita dapat menulisnya di formulir AzD. Sekarang ketidaksetaraan kami adalah AxB < AzD < AyC, yang setara dengan di xB < zD < yCmana ketiga digit-string berisi digit yang sama.
Agar hal itu benar, kita harus memilikinya x <= z <= y. Karena ymerupakan digit terkecil > x, ztidak dapat di antara keduanya, demikian juga z = xatau z = y. Katakan z = x. Maka ketidaksetaraan kita adalah xB < xD < yC, yang berarti di B < Dmana keduanya Bdan Dmemiliki angka yang sama. Namun, B adalah turun disortir, sehingga ada adalah tidak ada string dengan orang-digit lebih besar dari itu. Dengan demikian kita tidak dapat memiliki B < D. Mengikuti langkah yang sama, kita melihat bahwa jika z = y, kita tidak bisa D < C.
Karenanya N'tidak dapat ada, yang berarti algoritme kami dengan benar menemukan angka terbesar berikutnya.