Introsort neden birleştirme yerine yığın kullanır?


9

Introsort'un uygulanmasını kapsayan bir ev ödevi kapsamında , mergesort (veya bu konudaki diğer algoritmaları yerine) heapsort'un neden kullanıldığı sorulmuştur . O(nlog(n))

Introsort, hem hızlı ortalama performans hem de (asimptotik olarak) en kötü durum performansını sağlayan karma bir sıralama algoritmasıdır. Hızlı sıralama ile başlar ve yineleme derinliği sıralanan elemanların sayısına (logaritması) göre bir seviyeyi aştığında yığınlara geçer. ( Wikipedia , 2014-Mayıs-06'da alındı.)

Düşünebilmemin tek nedeni, yığının "yerinde" olmasıdır ... Ama tbh, bunun neden önemli olduğunu anlamıyorum.


3
Introsort sorunun bir parçasıysa, bize bir şey söyleyebilmemiz için ne olduğunu anlatmanız gerekir.
Louis

1
Bilgisayar Bilimine Hoşgeldiniz ! Matematiği daha okunabilir bir şekilde ayarlamak için LaTeX'i burada kullanabileceğinizi unutmayın. Kısa bir giriş için buraya bakın .
FrankW

Sadece intro sıralama için bazı sahte kodlar yapmamız isteniyor ve daha sonra neden birleştirme yerine heapsort kullandığını soruyoruz.
user672009

@ user672009 Bu durumda, her ikisinin de kodunu yazın ve ne bulduğunuzu görün. Nedeni performansla ilgili olabilir veya olmayabilir.
Raphael

2
Ben çabuk sıralar yerinde beri başka bir yerde sıralama algoritması kullanmamız gerektiği sonucuna vardım. Ancak girdi için açığım.
user672009

Yanıtlar:


9

Quicksort'un 2 dezavantajı, ekstra alanı (sıralanmamış aralıkları tutmak için) ve kötü pivot seçiminin (veya kötü bir pivot seçmenizi sağlayacak şekilde tasarlanan ardışık dizilerin) zaman ve ekstra uzay algoritması.O(logn)O(n2)O(n)

Özyineleme derinliği çok büyüdüğünde (yaklaşık n'da) yığın kümesine geçmek, süresi ve fazladan alanı olan garantili bir üst sınırımız olduğu anlamına gelir .lognO(nlogn)O(logn)

Heapsort'un ekstra alan gereksinimi, hala büyük olabileceği, anlaşılmaz bir dizi için birleştirilmesini daha iyi bir seçim haline getirir .O(1)O(n)n

Yığın sıralamanın tam sıralama için kullanılmamasının nedeni hızlı sıradan daha yavaş olmasıdır (kısmen büyük O ifadesindeki gizli sabitler ve kısmen de önbellek davranışından dolayı)


Ama heatsort kullanılıyor ... ve sanırım bunun çabuk gibi olduğu için.
user672009

@ User672009'un son cümlenizle karıştırıldığından şüpheleniyorum. Ben içgözlemle sıralama etmediğini açıklayan öneririm başlamak daha yavaş olduğu için HizliSiralama ile.
Gezici Mantık

@ user672009, alan "yerinde" anlamına gelir ve fazladan alan gerektirdiğinden hızlı sıralama tam olarak yerinde değildir . O(1)O(lgn)
Gezici Mantık

Ayrıca, heapsort, introsorttan çok daha fazla önbellek kaybına sahiptir.
noɥʇʎԀʎzɐɹƆ

İyi bir Quicksort uygulaması, yığın üzerindeki daha büyük alt aralığı hatırladığı ve daha küçük olanı hemen işlediği sürece, en kötü durumda O (n) alanına ihtiyaç duymaz.
gnasher729
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.