Sıralama hangi algoritmayı kullanır?


24

Zaten sıralanmış olan bir listeye doğru bir yere gelmesi için tek bir tamsayı eklemem gerekiyor. İlk düşündüğüm şey gibiydi

(sort (cons newelt list) #'<)

Ancak, listhalihazırda sıralandığı göz önüne alındığında , yalnızca bir ekleme gerçekten gereklidir, bu, bu çözümün kullandığı algoritmaya bağlı olarak korkunç derecede uygun olabileceği anlamına gelir sort.

Peki, kullanılan algoritma hangisi sort?

Aşağıdaki gibi bir şey yaparak daha iyi olur muyum?

(let ((tail list))
  ;; The first element is never less-than
  (while (and tail (< newelt (cadr tail)))
    (setq tail (cdr tail)))
  (setcdr tail (cons newelt (cdr tail)))
  list)

1
Kodumda sık sık yapılan bir işlem olsaydı, ikili bir yığın (örneğin heap.el ) kullanırdım.
lunaryorn

Izin Bzaten sıralanmış başlangıç olması listve Ave Cbaşlangıçta boş listeleri. Bölünmüş Biki parçalı olarak B1, B2uzunlukları mve mya m+1ve m, karşılaştırma neweltbirinci elemana B2. Eğer neweltis uzatmak Aile sağa B1ve değiştirme Bile B2, başka uzatmak Cile sola B2ve değiştirme Bile B1. O(log n)Bu adımlardan sonra hiçbir şey kalmaz B. Sonra Aşeyi içermesi ≤ neweltve Cbu > neweltve birleştirme genişletilmiş sıralı liste üretir. Dilden e-lisphoşlanmadığım için özür dilerim .
jfbu

Yanıtlar:


26

Yüklü Emac kaynak kodunuz varsa, kaynak kodunu ile sortbirlikte bulabilirsiniz M-x find-function.

Orada sortbir birleştirme işlemi gerçekleştirdiğini görebilirsiniz . Listenin uzunluğunu kontrol eder, listeyi ikiye böler, “ön” ve “arka” kısımları özyineleme yoluyla ayrı olarak sıralar ve sonra ikisini birleştirir.

Uygulamanızın daha hızlı olup olmayacağına gelince - ölçün! Teoride daha verimlidir (O ​​(n) vs O (n log n)), ancak sortC'ye yazılma avantajına sahiptir, bu nedenle sonuç her iki yönde de olabilir. (Tabii ki, işlevinizi byte-derlemeyi unutmayın.)


@Malabarba Kayıt için, hangi ölçekte uzunluklarda test ettiniz?
T. Verron

8
1000 kez rastgele sayı ekleyerek 1000 rasgele sayı listesine eklenir (tümü önceden belirlenmiş). Manuel yöntem 6 kat daha hızlıydı.
Malabarba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.