Ekleme sıralaması ve Kabarcık Sıralama Algoritmaları


87

Birkaç sıralama algoritmasını anlamaya çalışıyorum, ancak kabarcık sıralama ve ekleme sıralama algoritmasındaki farkı görmeye çalışıyorum.

Her ikisinin de O (n 2 ) olduğunu biliyorum , ama bana öyle geliyor ki, kabarcık sıralaması her geçiş için dizinin maksimum değerini en üste çıkarırken, ekleme sıralaması her geçişte en düşük değeri en alta indirir. Aynı şeyi farklı yönlerde mi yapıyorlar?

Ekleme sıralaması için, karşılaştırma / potansiyel takas sayısı sıfırdan başlar ve her seferinde artar (yani 0, 1, 2, 3, 4, ..., n), ancak kabarcık sıralama için bu aynı davranış olur, ancak sonunda sıralama (yani n, n-1, n-2, ... 0) çünkü kabarcık sıralamanın artık sıralanırken son elemanlarla karşılaştırması gerekmiyor.

Tüm bunlara rağmen, ekleme sıralamanın genel olarak daha iyi olduğu konusunda bir fikir birliği olduğu görülüyor. Biri bana nedenini söyleyebilir mi?

Düzenleme: Öncelikle algoritmaların nasıl çalıştığı konusundaki farklılıklarla ilgileniyorum, verimlilikleri veya asimptotik karmaşıklıkları değil.


1
Bu, başka bir yerde iyi bir şekilde belgelenmiştir: bkz . Örneğin, en.wikipedia.org/wiki/Sorting_algorithm . Burada çoğaltmak oldukça anlamsız ve iyi bir cevap kapsamlı olacaktır.
Bathsheba

@Bathsheba 75 olumlu oy kullanan ve soruyu görüntüleyen 88k kişi aynı fikirde değil gibi görünüyor; )
parsecer

@parsecer: Ha! Şimdi cevapları gözden geçirmem gerekecek. Mevcut en yüksek oy alan cevap kullanışlıdır; Başkaları hakkında emin değilim. Cevap düşürerek kaybedilen bazı temsilci puanları. Kabul edilen yanıtta "Bu yüzden ekleme sıralaması balonlu sıralamadan daha hızlıdır" iddiası mutlaka doğru değildir.
Bathsheba

@Bathsheba Oh hayır
parsecer

Yanıtlar:


41

Yinelemede kabarcık sıralamasında, ni-1 iç yinelemelere (n ^ 2) / toplam 2 sahip olursunuz, ancak eklemeli sıralamada i'inci adımda maksimum yinelemeniz olur, ancak iç döngüyü durdurabileceğiniz için ortalama olarak i / 2 vardır daha önce, geçerli öğe için doğru konumu bulduktan sonra. Yani (0'dan n'ye toplamı) / 2'ye sahipsiniz, bu da (n ^ 2) / 4'tür;

Bu nedenle, ekleme sıralaması balonlu sıralamadan daha hızlıdır.


2
Algoritma açıklaması her yerde web'de bence.
sasha.sochka

4
evet, ama görünüşe göre OP hala mekanizmalarda fark yakalamıyor
UmNyobe

15
Temelleri anladığımı varsayabilirsin . İstediğim bir karşılaştırmaydı ve bu gerçekten çok iyi. Yani fikir şu ki, ekleme sıralaması i'inci öğenin çökmesine neden olurken ve kabarcıklı sıralama, kabarcıkların yükselmesine neden olurken, ekleme sıralaması en dibe düşmesine neden olmaz, sadece doğru konuma düşmesine neden olur. önceden sıralanmış bölüm. Böylece daha az karşılaştırma / takas yapar. Bu doğru mu?
Migwell

2
Ne? "Yani (0'dan n'ye kadar) / 2'ye sahipsin, bu da (n ^ 2) / 4 toplam" Bu biraz açıklama gerektirir, lütfen! 0 + 1 + 2 + 3 + 4 + 5 = 15; 15/2 = 7,5; 7.5 * 4 = 30; sqrt (30) = anlamsız
John Smith

@JohnSmith Cevapta küçük bir hata olduğuna inanıyorum. Üçgen bir sayı olduğu için 1'den n'ye kadar olan toplam n * (n + 1) / 2'dir. Daha fazla açıklama için üçgen sayıya bakın. Yani 2'ye bölmek sadece n * (n + 1) / 2'dir.
CognizantApe

124

Ekleme Sıralaması

Sonra ben ilk tekrarlamalar i elemanları sıralanır.

Her yinelemede, sıralanan bölümden bir sonraki öğe doğru noktaya ulaşana kadar köpürtülür :

sorted  | unsorted
1 3 5 8 | 4 6 7 9 2
1 3 4 5 8 | 6 7 9 2

4, sıralanmış bölüme köpürtülür

Sözde kod:

for i in 1 to n
    for j in i downto 2
        if array[j - 1] > array[j]
            swap(array[j - 1], array[j])
        else
            break

Kabarcık Sıralama

Sonra ben tekrarlamalar son ı elemanlar büyük, ve emretti.

Her yinelemede, maksimum değeri bulmak için sıralanmamış bölümü eleyin .

unsorted  | biggest
3 1 5 4 2 | 6 7 8 9
1 3 4 2 | 5 6 7 8 9

5, sıralanmamış bölümden köpürtülür

Sözde kod:

for i in 1 to n
    for j in 1 to n - i
         if array[j] > array[j + 1]
             swap(array[j], array[j + 1])

Dış döngünün yinelemelerinden biri sırasında takas yapılmazsa tipik uygulamaların erken sona ereceğini unutmayın (çünkü bu, dizinin sıralandığı anlamına gelir).

Fark

Eklemede sıralama öğeleri sıralanmış bölüme kabarcıklandırılırken, kabarcık sıralamasında maksimumlar sıralanmamış bölümden dışarı çıkar.


10
Teşekkürler, bu çok açık! Sanırım vurgulanması gereken en önemli şey , Ekleme Sıralamasındaki break ifadesinin, her yinelemeyi erken sonlandırabileceği anlamına geliyor: yani, sıralı bölümde konumunu bulduğunda. Kabarcık sıralaması, takas işleminin sıralanmamış bölümdeki en büyük öğenin sıralı bölüme ulaşana kadar devam etmesini gerektirir, bu nedenle asla erken sonlanmaz. Yine de harika bir özet, yani +1
Migwell

4
Bence bu en iyi cevap olmalı :)
Adelin

2
Netlik, didaktik değer ve her algoritmanın ana döngü değişmezleri için artı 1 . Karmaşıklığın karşılaştırmasını açıkça içermemesi üzücü ( n'nin bir fonksiyonu olarak ifade edilir ), yine de kabul edilenden daha iyi bir cevap olduğunu düşünüyorum, çünkü bundan farkı görebiliyorum .
Honza Zidek

Her adımda Ekleme Sözde kodunuzdaki öğenizi neden değiştirdiğinizi sorabilir miyim? eğer (a [j-1]> a [j]) ise a [j] = a [j-1] DEĞİLSE eğer (a [j-1] <e && a [j]> e) a [j] ise = e; ara; , burada e öğenin sıralanması gerekir. Bu çözümle, önceden sıralanmış öğeleri değiştirmezsiniz, yalnızca kopyalarsınız. Biraz kafam karıştığı için açıklama yapmak için sabırsızlanıyorum.
Karoly

@Karoly, versiyonumu seçtim çünkü daha basit. Sizinki biraz daha hızlı, bunu belirtmeniz iyi. Wikipedia her iki versiyonu da tanımlar.
tom

16

Başka bir fark, burada görmedim:

Kabarcık sıralaması , takas başına 3 değer atamasına sahiptir : ileri itmek istediğiniz değeri kaydetmek için önce geçici bir değişken oluşturmanız gerekir (no.1), diğer takas değişkenini değeri yeni kaydettiğiniz noktaya yazmak zorunda kalmazsınız (No. 2) ve sonra geçici değişkeninizi başka bir noktaya (no. 3) yazmanız gerekir. Değişkeninizi doğru noktaya sıralamak için bunu her nokta için - ilerlemek istediğinizde - yapmanız gerekir.

Eklemeli sıralama ile değişkeninizi geçici bir değişkeni sıralamak için koyarsınız ve ardından değişkeniniz için doğru noktaya ulaştığınız sürece tüm değişkenleri o noktanın önüne 1 nokta geriye doğru yerleştirirsiniz. Bu, spot başına 1 değer ataması yapar . Sonunda geçici değişkeninizi noktaya yazarsınız.

Bu da çok daha az değer ataması yapar.

Bu, en güçlü hız avantajı değil, ancak bundan bahsedilebileceğini düşünüyorum.

Umarım kendimi anlaşılır ifade etmişimdir, eğer değilse, üzgünüm, ben doğuştan Britanya değilim


1
"ve sonra tüm değişkenleri o noktanın önüne 1 nokta geriye doğru koyun" - ve bu aynı zamanda verileri kaydırmak için bir dizi görev gerektirmez mi? (verilerin bağlantılı bir liste değil, bitişik olarak depolandığını varsayarsak)
Mark K Cowan

@MarkKCowan, evet, ekleme sıralaması yukarıdaki kullanıcının belirttiği gibi 'nokta' başına atama yaptığı yer. Temel olarak, ekleme sıralaması iç döngüde bir atama ile yazılabilirken, bubbleort'un iç döngüde 3 ataması vardır.
JSQuareD

9

Ekleme sıralamanın ana avantajı, çevrimiçi algoritma olmasıdır. Başlangıçta tüm değerlere sahip olmanız gerekmez. Bu, ağdan veya bazı sensörlerden gelen verilerle uğraşırken yararlı olabilir.

Bunun diğer geleneksel n log(n)algoritmalardan daha hızlı olacağını hissediyorum . Çünkü karmaşıklık, n*(n log(n))örneğin stream ( O(n)) ' den her bir değeri okumak / depolamak ve ardından tüm değerleri sıralamak ( O(n log(n))) olacaktır.O(n^2 log(n))

Aksine, Ekleme Sıralaması'nı kullanmak O(n)akıştan değerleri okumak ve O(n)değeri doğru yere koymak için gereklidir, bu nedenle O(n^2)sadece budur. Diğer bir avantajı, değerleri saklamak için arabelleklere ihtiyacınız olmaması, onları son hedefte sıralamanızdır.


Verilerin sırayla geçişinin bir diziyi taramaktan başka bir şey olması uygunsa, anında çok daha verimli bir şekilde sıralayabilirsiniz. Örneğin, öğeleri alırken ikili ağaca ekleyin. Bu O(n log(n)), yol boyunca her adımda sıralı bir koleksiyona sahip olmak için yapılan toplam işi verir . (Herhangi bir noktada sıralı geçiş O(m)). Sonunda sıralı bir sonuca ihtiyacınız varsa, ancak sıralama hesaplamasını verilerin aktarım süresiyle örtüştürmek istiyorsanız, bir Yığın iyi olabilir. (Ekleme sıralaması gibi yerinde çalışır).
Peter Cordes

Her neyse, O(f(n))karmaşıklık sınıfının uygulama ayrıntıları ve sabit faktörlerden daha önemli olması için yeterince büyük problem boyutlarıyla ne kabarcık-sıralama ne de ekleme-sıralama bunun için idealdir .
Peter Cordes

Düzeltme: Bir yığın bunun için iyi değildir. Öğeleri sıralı sırayla kaldırdıkça, sıralama işinin çoğunu yapar, bu yüzden büyütme çok ucuzdur. Buradaki amaç, işin çoğunun, son element geldiğinde yapılmasını sağlamaktır.
Peter Cordes

Her neyse, neklemeler için sıralı bir dizi tutmanız gerekiyorsa , o zaman gerçekten en üstte sıralanmamış bir elemanın olduğu neredeyse sıralı bir diziyi sıralamak için hangi algoritmanın en iyi olduğuna iner. Çoğu O(n log(n))sıralama algoritması O(n)neredeyse sıralı durumda olduğundan, sum(M=1..n, O(M * log(M)) )çalışmaya ihtiyacınız olduğu doğru değildir . Bu gerçekten olabilir O(n^2 log(n)), ancak doğru algoritma seçimiyle O(n^2)tam bir iş olacaktır. Ekleme-sıralama, bunun için en verimli olanıdır.
Peter Cordes

7

Kabarcık Sıralama çevrimiçi değildir (kaç öğe olacağını bilmeden bir girdi akışını sıralayamaz) çünkü sıralanan öğelerin genel maksimumunu gerçekten takip etmez. Bir öğe eklendiğinde köpürmeye en baştan başlamanız gerekecek


5

iyi kabarcık sıralama, yalnızca bir kişi büyük bir sayı listesinden ilk k öğeleri aradığında, yani k yinelemeden sonra kabarcık sıralamasında ilk k öğeleri elde edersiniz. Bununla birlikte, ekleme sıralamasında k yinelemeden sonra, yalnızca bu k öğelerinin sıralanmasını sağlar.


2

Her iki tür de O (N ^ 2) olsa da Gizli sabitler, Ekleme sıralamasında çok daha küçüktür. Gizli sabitler, gerçekleştirilen ilkel işlemlerin gerçek sayısını belirtir.

Eklemeli sıralamanın daha iyi çalışma süresi olduğunda?

  1. Dizi neredeyse sıralanmıştır - bu durumda eklemeli sıralamanın balonlu sıralamadan daha az işlem yaptığına dikkat edin.
  2. Dizi görece küçük boyuttadır: mevcut öğeyi yerleştirmek için öğeleri hareket ettirirsiniz. Bu, yalnızca öğe sayısı azsa kabarcık sıralamasından daha iyidir.

Eklemeli sıralamanın her zaman balonlu sıralamadan daha iyi olmadığına dikkat edin. Her iki dünyanın da en iyisini elde etmek için, dizi küçükse ekleme sıralamayı kullanabilir ve muhtemelen daha büyük diziler için birleştirme sıralaması (veya hızlı sıralama) kullanabilirsiniz.


2
Elementlerin sayısı az değilse, balon sıralaması nasıl daha iyi olur? Anladığım kadarıyla, IS'de kaymanız veya BS'de takas etmeniz, karşılaştırılan öğenin öğe sayısına değil, daha büyük (IS) veya daha küçük (BS) olmasına bağlı olacaktır. Lütfen yanlışsa düzeltin.
Mustafa

1

Her yinelemedeki takas sayısı

  • Ekleme sıralama, her yinelemede en fazla 1 takas yapar .
  • Kabarcıkla sıralama, her yinelemede 0 ila n arasında değiş tokuş yapar.

Sıralanmış parçaya erişim ve değiştirme

  • Ekleme-sıralama, dikkate alınan bir sayının doğru konumunu bulmak için sıralanmış parçaya erişir (ve gerektiğinde değiştirir).
  • Optimize edildiğinde, Kabarcık sıralama önceden sıralanmış olanlara erişmez.

Çevrimiçi ya da değil

  • Ekleme sıralaması çevrimiçidir. Bu, Ekleme-sıralamanın uygun konuma getirilmeden önce her seferinde bir girdi aldığı anlamına gelir . Sadece karşılaştırmak zorunda değil adjacent-inputs.
  • Kabarcık sıralama çevrimiçi değil. Bir seferde bir girişi çalıştırmaz. Her yinelemede bir grup girdiyi (tümü değilse) işler. Kabarcıkla sıralama, yalnızcaadjacent-inputs her yinelemede karşılaştırır ve değiştirir .

0

Kabarcık sıralaması her koşulda neredeyse işe yaramaz. Ekleme sıralamanın çok fazla takas içerebileceği kullanım durumlarında, seçim sıralaması kullanılabilir çünkü N kez takas süresini garanti eder. Seçimli sıralama, balonlu sıralamadan daha iyi olduğu için, balonlu sıralamanın kullanım durumu yoktur.


0

ekleme sıralaması:

1. Eklemede sıralama değiş tokuşu gerekli değildir.

2. ekleme sıralamanın zaman karmaşıklığı en iyi durum için Ω (n) ve en kötü durum için O (n ^ 2) şeklindedir.

Kabarcıklı sıralama ile karşılaştırıldığında 3. daha az karmaşık.

4. örnek: kitaplığa kitap ekleyin, kartları düzenleyin.

bubble sort: 1. Kabarcık sıralamasında değiştirme gereklidir.

2. Kabarcık sıralamanın zaman karmaşıklığı en iyi durum için Ω (n) ve en kötü durum için O (n ^ 2) şeklindedir.

3. Eklemeli sıralamaya göre daha karmaşık.


1
Nasıl takas gerekli olmaz? Bir öğeyi doğru konuma getirmek için öğeleri değiştirir. Ve balon sıralamanın daha karmaşık olduğunu söyleyemem.
parsecer

-1

Ekleme sıralaması, " İlk konumda (minimum) olması gereken öğeyi arayın, sonraki öğeleri kaydırarak biraz yer açın ve ilk konuma yerleştirin. İyi. Şimdi 2. olması gereken öğeye bakın. ... "ve benzeri ...

Kabarcık sıralaması farklı şekilde çalışır ve " Yanlış sırada olan iki bitişik öğe bulduğum sürece onları değiştiririm " şeklinde devam ettirilebilir .


Bu, ekleme sıralaması konusunda yardımcı olur, ancak kabarcık sıralama açıklamanız gerçek döngüleri içermiyor, bu yüzden onları gerçekten karşılaştıramıyorum. Ekleme sıralaması da etkili bir kurala sahiptir.Yanlış sırada olan iki bitişik öğe bulduğum sürece, onları değiştiririm , döngülerin işleyiş şekli farklıdır.
Migwell

3
Bu seçim sıralı değil mi?
harold
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.