Numaraların bir listesini yapmam gerekiyor, ama çok tembelim. Tüm sayıları sıralayana kadar etrafındaki sayıları nasıl değiştireceğinizi anlamak gerçekten zor, bu yüzden yeni listenin sıralanacağını garanti edecek kendi algoritmamla geldim. İşte nasıl çalışıyor:
N büyüklüğünün bir listesi için N-1 yinelemeye ihtiyacımız olacak . Her yinelemede,
N'ci sayıların N + 1'lik sayıdan küçük olup olmadığını kontrol edin . Öyleyse, bu iki sayı zaten sıralanır ve bu yinelemeyi atlayabiliriz.
Değilse, bu iki sayı sıralanana kadar ilk N sayısını sürekli olarak azaltmanız gerekir .
Somut bir örnek alalım. Diyelim ki girdi
10 5 7 6 1
İlk yinelemede, 10 ve 5'i karşılaştıracağız. 10, 5'ten büyüktür, bu nedenle daha küçük olana kadar azaltırız:
4 5 7 6 1
Şimdi 5 ile 7'yi karşılaştırıyoruz. 5 7'den daha küçük, bu nedenle bu yinelemede bir şey yapmamıza gerek yok. Öyleyse sonrakine gidip 7 ile 6'yı karşılaştırırız. 7 6'dan büyüktür, bu yüzden ilk üç sayıyı 6'dan küçük olana dek azaltır ve şunu elde ederiz:
2 3 5 6 1
Şimdi 6 ile 1'i karşılaştırıyoruz. Yine, 6 1'den büyük, bu yüzden ilk dört sayıyı 1'den küçük olana kadar düşürdük ve şunu elde ettik:
-4 -3 -1 0 1
Ve biz bitti! Şimdi listemiz mükemmel bir sıralama düzeninde. Ve, işleri daha da iyi hale getirmek için, sadece N-1 listesini tekrarlamak zorunda kaldık , bu yüzden bu algoritma O (N-1) zamanındaki listeleri sıralar, ki bu da en hızlı algoritma olduğundan eminim.
Bugün için zorlu göreviniz bu Tembel Sıralama'yı uygulamak. Programınıza veya fonksiyonunuza, istediğiniz standart formatta bir tamsayı dizisi verilecek ve bu tembel sıralama işlemini gerçekleştirmeli ve yeni "sıralı" listeye geri dönmelisiniz . Dizi asla boş olmaz veya tamsayı içermez.
İşte bazı örnekler:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
Her zaman olduğu gibi, bu kod golf , bu yüzden mümkün olan en kısa programı yazın!
¹ Bu, kulağa nasıl geldiği anlamına gelmez, ancak teknik olarak doğrudur.
² Şaka yapıyorum, lütfen benden nefret etme
<sarcasm>
Bu sıralama algoritması gerçekte O(N^2)
zaman zaman karmaşıklığını hala sürdürmektedir, çünkü listedeki önceden erişilmiş tüm öğeleri gözden geçirmek için onları azaltmak zorundasınız. Listeyi geriye doğru atmanızı ve adım başına yalnızca bir sayıyı azaltmanızı öneririm . Bu size gerçek bir O(N)
karmaşıklık verecektir ! </sarcasm>
O(n^2)
bellek erişimleri açısından, ancak O(n)
karşılaştırmalar için değil mi?
O(N^2)
.