Bunu (basamak sayısı O(n)
nerede n
) şu şekilde yapabilirsiniz:
Sağdan başlayarak, ilk basamak çiftini, sol basamak sağ basamaktan daha küçük olacak şekilde bulursunuz. Sol basamağa "basamak-x" ile bakalım. X basamağının sağındaki x basamağından daha büyük olan en küçük sayıyı bulun ve x basamağının hemen soluna yerleştirin. Son olarak, kalan basamakları artan sırada sıralayın - zaten azalan sırada olduklarından , yapmanız gereken tek şey onları tersine çevirmek (doğru yere yerleştirilebilen basamak x için kaydedin O(n)
) .
Bir örnek bunu daha açık hale getirecektir:
123456784987654321
bir numara ile başla
123456784 987654321
^ sol basamağın sağdan daha az olduğu sağdan ilk yer
Basamak "x" 4'tür
123456784 987654321
^ Sağda 4'ten büyük en küçük rakamı bulun
123456785 4 98764321
^ 4'ün soluna yerleştirin
123456785 4 12346789
123456785123446789
^ 5'in sağındaki rakamları sıralayın.
'4' zaten azalan sıradaydı, tek yapmamız gereken
siparişlerini tersine çevirin ve '4' için doğru yeri bulun
Doğruluk kanıtı:
Rakam dizelerini ve rakamlar için küçük harfleri tanımlamak için büyük harfler kullanalım. Sözdizimi AB
aracı "dizeleri birleştirme A
ve B
" . <
sözcük dizisi, basamak dizeleri eşit uzunlukta olduğunda tamsayı sıralaması ile aynıdır.
Orijinal N numaramız AxB
, x
tek basamaklı ve B
azalan şekilde sıralanan formdadır .
Numara olan bizim algoritması tarafından bulundu AyC
nerede, y ∈ B
küçük sayıdır > x
(bu yol nedeniyle bulunması gerekir x
seçildi yukarıya bakınız) ve C
sıralı artan olduğunu.
Varsayalım ki (aynı rakamları kullanarak) bir sayı N'
vardır AxB < N' < AyC
. N'
ile başlamalı A
ya da aralarında düşemezdi, böylece formda yazabiliriz AzD
. Şimdi eşitsizliğimiz, her üç rakam dizesinin de aynı rakamları içerdiği yerle AxB < AzD < AyC
eşdeğerdir xB < zD < yC
.
Bunun gerçek olabilmesi için sahip olmalıyız x <= z <= y
. Yana y
en küçük rakamdır > x
, z
bu yüzden ya, aralarında olamaz z = x
ya z = y
. Söyle z = x
. Sonra bizim eşitsizlik olduğu xB < xD < yC
anlamına gelir B < D
nereye hem B
ve D
aynı basamaktan. Ancak, B sıralı inen bu yüzden orada olması ise bunun daha büyük olanlar basamağı ile hiçbir dize. Böylece sahip olamayız B < D
. Aynı adımları takiben, eğer görüyoruz z = y
, biz olamaz D < C
.
Bu nedenle var N'
olamaz, yani algoritmamız bir sonraki en büyük sayıyı doğru bir şekilde bulur.