Ekleme Sıralaması ile Seçim Sıralaması


110

Ekleme Sıralaması ile Seçim Sıralaması arasındaki farkları anlamaya çalışıyorum.

İkisinin de iki bileşeni var gibi görünüyor: sıralanmamış bir liste ve sıralı bir liste. İkisi de sıralanmamış listeden bir öğe alıyor ve uygun yerde sıralı listeye koyuyor gibi görünüyor. Seçim sıralamanın bunu her seferinde birini değiştirerek yaptığını söyleyen bazı siteler / kitaplar gördüm, bu arada ekleme sıralaması yalnızca doğru noktayı bulur ve onu ekler. Bununla birlikte, diğer makalelerin bir şeyler söylediğini gördüm, ekleme sıralaması da değişiyor. Sonuç olarak kafam karıştı. Herhangi bir kanonik kaynak var mı?


8
Seçim sıralaması için olan wikipedia , ekleme sıralaması için olduğu gibi sözde kod ve güzel resimlerle birlikte gelir .
G. Bach

6
@ G.Bach - bunun için teşekkürler ... Her iki sayfayı da defalarca okudum ama farkı anlamadım - dolayısıyla bu soru.
eb80

3
Computerphile'a göre bunlar aynı: youtube.com/watch?v=pcJHkWwjNl4
Tristan Forward

Yanıtlar:


186

Seçim Sıralaması:

Bir liste verildiğinde, mevcut öğeyi alın ve mevcut öğenin sağ tarafındaki en küçük öğe ile değiştirin. Seçim Sıralaması

Ekleme Sıralaması:

Bir liste verildiğinde, mevcut öğeyi alın ve her eklediğinizde listeyi ayarlayarak listenin uygun konumuna ekleyin. Bir Kart oyununda kartları düzenlemeye benzer. Ekleme Sıralaması

Seçim sıralamanın Zaman Karmaşıklığı her zaman olduğu n(n - 1)/2gibi, ekleme sıralaması, en kötü durum karmaşıklığı olduğu için daha iyi zaman karmaşıklığına sahiptir n(n - 1)/2. Genelde daha az veya eşit karşılaştırmalar alacaktır n(n - 1)/2.

Kaynak: http://cheetahonfire.blogspot.com/2009/05/selection-sort-vs-insertion-sort.html


2
@Nikolay - Bu daha önce okuduğum cheetahonfire.blogspot.com/2009/05/… adresinden kopyalandı . Birbiriyle çelişen makaleler okuduğumdan daha fazla konser var mı?
eb80

5
Temel fark, seçim adımıdır. Ekleme sıralama olarak uygun pozisyonda mevcut bir ekler ilkinden seçimi sıralama seçer küçük bir ve değişim de
Nikolay Kostov

6
@ eb80 Hangi materyali okuduğunuzdan emin değilim, ama bir örneğin bundan daha somut olabileceğini anlamıyorum?
G. Bach

23
Peki takas sayısı ne olacak? Seçim her zaman n (n-1) / 2 karşılaştırması yapar, ancak en kötü durumda yalnızca n-1 takas yapar. En kötü durumda, Ekleme n (n-1) / 2 karşılaştırmasının yanı sıra n (n-1) / 2 takas yapacaktır.
Jason Goemaat

2
@Adorn Bunların hiçbiri bölme ve yönetme algoritmaları değildir.
Asky McAskface

64

Hem ekleme sıralaması hem de seçim sıralaması bir dış döngüye (her dizinin üzerinde) ve bir iç döngüye (bir dizin alt kümesi üzerinde) sahiptir. İç döngünün her geçişi, sıralanmamış elemanlar bitene kadar sıralanmamış bölge pahasına sıralanan bölgeyi bir eleman kadar genişletir.

Aradaki fark, iç döngünün yaptığı şeydir:

  • Seçim sıralamasında, iç döngü sıralanmamış elemanların üzerindedir . Her geçiş bir öğeyi seçer ve onu son konumuna (sıralanan bölgenin o anki sonunda) taşır.

  • Ekleme sıralamasında, iç döngünün her geçişi, sıralanmış elemanlar üzerinde yinelenir . Sıralanan elemanlar, döngü bir sonraki sıralanmamış elemanı eklemek için doğru yeri bulana kadar yer değiştirir.

Bu nedenle, bir seçim sıralamasında, sıralanmış öğeler çıktı sırasına göre bulunur ve bulunduklarında sabit kalırlar. Tersine, bir ekleme sıralamasında, sıralanmamış sıralanan bölgenin öğeleri hareket etmeye devam ederken öğeler girdi sırasına göre tüketilene kadar kalır.

Takas söz konusu olduğunda: seçim sıralaması, iç döngünün geçişi başına bir takas yapar. Ekleme sıralaması, tipik olarak , iç döngüden temp önceki gibi eklenecek öğeyi kaydederek, sıralanan öğeleri birer birer yukarı kaydırması için yer bırakır, ardından kopyalartemp ekleme noktasına .


23

SEÇİM SIRALAMASI
Belirli / rasgele bir şekilde yazılmış sayılar dizisi olduğunu varsayalım ve artan sırayla dizmek zorunda olduğumuzu varsayalım .. bu nedenle, her seferinde bir sayı alın ve en küçük no ile değiştirin. listede mevcuttur. bu adımı yaparak nihayetinde istediğimiz sonucu alacağız.

görüntü açıklamasını buraya girin



EKLEME SIRALAMASI
Benzer varsayımı göz önünde bulundurursak, tek fark, bu kez bir seferde bir sayı seçip bunu önceden sıralanan kısma yerleştirmemizdir, bu da karşılaştırmaları azaltır ve dolayısıyla daha verimli olur.

görüntü açıklamasını buraya girin


Youtube'daki mycodeschool'a göz atın . Ancak bu cevap, youtube'daki 2 algoritmanın videolarında anlatılanları tamamlıyor.
JaydeepW

21

Karışık bir listeyi sıralamanın bir açıklamasını bir diziyi sıralamanın bir açıklamasıyla karşılaştırmanızdan kaynaklanıyor olabilir. . Ama kaynaklarınıza atıfta bulunmadığınız için emin olamıyorum.

Sıralama algoritmalarını anlamanın en kolay yolu, genellikle algoritmanın ayrıntılı bir açıklamasını elde etmektir ("bu tür takas kullanır. Bir yerde. Nerede olduğunu söylemiyorum" gibi belirsiz şeyler değil), biraz oyun kağıdı alın (5-10 yeterli olmalı basit sıralama algoritmaları için) ve algoritmayı elle çalıştırın.

Seçim sıralaması: Kalan en küçük öğeyi aramak için sıralanmamış verileri tarayın, ardından sıralanan verileri hemen takip eden konuma değiştirin. Bitene kadar tekrarlayın. Bir listeyi sıralıyorsanız, en küçük öğeyi yerine yerleştirmenize gerek yoktur, bunun yerine liste düğümünü eski konumundan kaldırabilir ve yenisine ekleyebilirsiniz.

Ekleme sıralaması: sıralanan verilerin hemen ardından öğeyi alın, yerleştirilecek yeri bulmak için sıralanan verileri tarayın ve oraya yerleştirin. Bitene kadar tekrarlayın.

Ekleme sıralama olabilir onun "tarama" aşamasında takas kullanın, ancak zorunda değildir ve bir veri türü bir dizi sıralama sürece en etkili yolu değil ki: (a) taşınamaz, sadece kopyalanmış veya takas; ve (b) kopyalamak takas etmekten daha pahalıdır. Ekleme sıralaması takas kullanıyorsa, çalışma şekli, eşzamanlı olarak yeri aramak ve yeni öğeyi oraya yerleştirmektir. Yeni öğeyi, önceki öğe daha büyük olduğu sürece, hemen öncesine tekrar tekrar değiştirerek o. Daha büyük olmayan bir öğeye ulaştığınızda, doğru konumu buldunuz ve bir sonraki yeni öğeye geçersiniz.


1
Bu çok yardımcı ... Son paragraf, her türdeki varyantlardan kaynaklanan, yaşadığım kafa karışıklığını çözüyor.
eb80

1
Bağlantılı bir listede ekleme sıralaması kullanmanın, yerinde diziden tamamen farklı bir takas verimliliği olduğunu belirtmek için +1
Gavin Achtemeier

11

Her iki algoritmanın mantığı oldukça benzer. Her ikisinin de dizinin başında kısmen sıralanmış bir alt dizisi vardır. Tek fark, sıralı diziye yerleştirilecek bir sonraki öğeyi nasıl aradıklarıdır.

  • Ekleme sıralaması : sonraki öğeyi doğru konuma ekler ;

  • Seçim sıralaması : en küçük öğeyi seçer ve mevcut öğe ile değiştirir;

Ayrıca, Ekleme Sıralaması , Seçim Sıralamasının aksine sabittir .

İkisini de python'da uyguladım ve ne kadar benzer olduklarına dikkat çekmeye değer:

def insertion(data):
    data_size = len(data)
    current = 1
    while current < data_size:
        for i in range(current):
            if data[current] < data[i]:
                temp = data[i]
                data[i] = data[current]
                data[current] = temp

        current += 1

    return data

Küçük bir değişiklikle Seçim Sıralama algoritmasını yapmak mümkündür.

def selection(data):
    data_size = len(data)
    current = 0
    while current < data_size:
        for i in range(current, data_size):
            if data[i] < data[current]:
                temp = data[i]
                data[i] = data[current]
                data[current] = temp

        current += 1

    return data

üzgünüm, neden (seçim sıralama algoritması), veriler [i] daha küçük olduğunda [i] verilerinin [mevcut] verilerle değiştirildiğini merak ediyordum. Temel / orijinal (?) Seçim sıralamasında, aralık (i, veri_boyutu) arasındaki minimum değeri buluruz ve bu minimum değerle veri alışverişi [i] yaparız ... bu biraz farklı ...
Tony Ma

4

Özetle, seçim sıralaması ilk önce dizideki en küçük değeri aradığını ve sonra takas yaptığını, buna karşılık ekleme sıralaması bir değer alıp ona kalan (arkasındaki) her bir değerle karşılaştırdığını düşünüyorum. Değer daha küçükse değiştirilir. Daha sonra aynı değer tekrar karşılaştırılır ve arkasındaki değerden daha küçükse tekrar yer değiştirir. Umarım bu mantıklıdır!


4

Kısacası,

Seçim sıralaması: Sıralanmamış diziden ilk öğeyi seçin ve kalan sıralanmamış öğelerle karşılaştırın. Kabarcık sıralamasına benzer, ancak her küçük öğeyi değiştirmek yerine, en küçük öğe dizinini güncel tutar ve her döngünün sonunda onu değiştirir .

Ekleme sıralaması: Sıralanmamış alt diziden ilk öğeyi seçip sıralı alt diziyle karşılaştırdığı ve bulunduğu en küçük öğeyi eklediği ve sıralanan tüm öğeleri sağından ilk sıralanmamış öğeye kaydırdığı Seçim sıralamasının tersidir .


3

Bir kez daha deneyeceğim: Neredeyse sıralı dizilerin şanslı durumunda ne olacağını düşünün.

Sıralama sırasında dizinin iki bölümü olduğu düşünülebilir: sol taraf - sıralı, sağ taraf - sıralanmamış.

Ekleme sıralaması - ilk sıralanmamış öğeyi seçin ve önceden sıralanmış parçalar arasında bunun için bir yer bulmaya çalışın. Sağdan sola arama yaptığınız için, karşılaştırdığınız ilk sıralanan öğenin (en büyük olan, en sağdaki soldaki) seçilen öğeden daha küçük olması çok iyi olabilir, böylece bir sonraki sıralanmamış öğeye hemen devam edebilirsiniz.

Seçim sıralaması - ilk sıralanmamış öğeyi seçin ve tüm sıralanmamış parçanın en küçük öğesini bulmaya çalışın ve istenirse bu ikisini değiştirin. Sorun şu ki, doğru kısım sıralanmamış olduğundan, her seferinde her öğeyi düşünmek zorundasınız, çünkü seçilmiş olandan daha küçük bir öğenin olup olmadığından emin olamazsınız.

Btw., Bu tam olarak yığın sırasının seçim sıralaması üzerine geliştirdiği şeydir - en küçük öğeyi çok daha hızlı bulabilir, çünkü yığın .


3

Seçim Sıralaması: Sıralanmış alt listeyi oluşturmaya başladığınızda, algoritma, sıralanan alt listenin yalnızca kendi öğeleri açısından değil, aynı zamanda tüm dizi, yani hem sıralanmış hem de sıralanmamış alt liste açısından her zaman tamamen sıralanmasını sağlar. Böylece, sıralanmamış alt listeden bir kez bulunan en küçük eleman, sıralanan alt listenin sonuna eklenir.

Ekleme Sıralaması: Algoritma diziyi yine iki kısma ayırır, ancak burada eleman ikinci kısımdan seçilir ve ilk kısma doğru konumda yerleştirilir. Bu hiçbir zaman ilk bölümün tam dizi açısından sıralandığını garanti etmez, ancak tabii ki son geçişte her eleman doğru sıralı konumunda olacaktır.


3

Her iki algoritma da genellikle şu şekilde çalışır

Adım 1: Sıralanmamış listeden bir sonraki sıralanmamış öğeyi alın ve ardından

Adım 2: Sıralanan listede doğru yere koyun.

Adımlardan biri bir algoritma için daha kolaydır ve bunun tersi de geçerlidir.

Ekleme sıralaması : Sıralanmamış listenin ilk öğesini alırız, sıralı listeye bir yere koyarız . Bir sonraki öğeyi (sıralanmamış listedeki ilk konum) nereye götüreceğimizi biliyoruz, ancak onu nereye koyacağımızı (bir yere ) bulmak için biraz çalışma gerekiyor . Adım 1 kolaydır.

Seçim sıralaması : Öğeyi sıralanmamış listeden bir yere alırız, ardından sıralanan listenin son konumuna yerleştiririz. Bir sonraki öğeyi bulmalıyız (büyük olasılıkla sıralanmamış listenin ilk konumunda değil, daha çok bir yerde ) ve ardından sıralı listenin sonuna koymalıyız. Adım 2 kolaydır


2

Ekleme sıralamasının iç döngüsü, önceden sıralanmış öğelerden geçer (seçim sıralamasının aksine). Bu , doğru pozisyon bulunduğunda iç döngüyü durdurmasına izin verir . Bunun anlamı:

  1. İç döngü, ortalama bir durumda öğelerinin yalnızca yarısından geçecektir.
  2. Dizi neredeyse sıralanırsa, iç döngü daha da erken iptal edilecektir.
  3. Dizi halihazırda sıralanmışsa iç döngü derhal durur ve bu durumda ekleme sıralaması karmaşıklığını doğrusal hale getirir.

Seçim sıralaması her zaman tüm iç döngü elemanlarından geçmelidir. Bu nedenle, ekleme sıralaması çoğunlukla seçim sıralamasına tercih edilir. Ancak diğer yandan, seçim sıralaması çok daha az öğe değiş tokuşu yapar, bu da bazı durumlarda daha önemli olabilir.


1

Temel olarak ekleme sıralaması, bir seferde iki öğeyi karşılaştırarak çalışır ve seçim sıralaması, tüm diziden minimum öğeyi seçer ve sıralar.

Kavramsal olarak ekleme sıralaması, tüm dizi sıralanana kadar iki öğeyi karşılaştırarak alt listeyi sıralamaya devam ederken, seçim sıralaması minimum öğeyi seçer ve onu birinci konuma ikinci minimum öğeyi ikinci konuma vb.

Ekleme sıralaması şu şekilde gösterilebilir:

    for(i=1;i<n;i++)
        for(j=i;j>0;j--)
            if(arr[j]<arr[j-1])
                temp=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=temp;

Seçim sıralaması şu şekilde gösterilebilir:

    for(i=0;i<n;i++)
        min=i;
        for(j=i+1;j<n;j++)
        if(arr[j]<arr[min])
        min=j;
        temp=arr[i];
        arr[i]=arr[min];
        arr[min]=temp;

1

Bu 2 sıralama algoritmasının seçimi, kullanılan veri yapısına bağlıdır.

Dizileri kullanırken, seçim sıralaması kullanın (yine de neden, qsort'u ne zaman kullanabilirsiniz?) Bağlantılı listeleri kullanırken, ekleme sıralaması kullanın.

Bunun nedeni ise:

  • Bağlı liste geçişi dizilerden daha pahalıdır.
  • Bağlı liste ekleme dizilerden çok daha ucuzdur.

Ekleme sıralaması, yeni değeri sıralanan segmentin ortasına enjekte eder. Bu nedenle, verilerin "geri itilmesi" gerekir. Bununla birlikte, bağlantılı bir liste kullandığınızda, 2 işaretçiyi çevirerek tüm listeyi etkili bir şekilde geri itmiş olursunuz. Bir dizide, değerleri geri itmek için n - i değiş tokuşu yapmanız gerekir ki bu çok pahalı olabilir.

Seçim sıralaması her zaman sona eklenir, bu nedenle dizileri kullanırken bu sorunu yaşamaz. Bu nedenle, verilerin "geri itilmesi" gerekmez.


0

Basit bir açıklama aşağıdaki gibi olabilir:

Verilen : Sıralanmamış bir dizi veya sayılar listesi.

Sorun bildirimi : Seçim Sıralaması ve Ekleme Sıralaması arasındaki farkı anlamak için sayıların listesini / dizisini artan düzende sıralamak için.

Ekleme Sıralaması:Daha kolay anlaşılması için listeyi yukarıdan aşağıya doğru görürsünüz. İlk unsuru başlangıçtaki minimum değerimiz olarak kabul ediyoruz. Şimdi, fikir şu ki, herhangi bir dizinde başlangıçtaki minimum değerden daha düşük bir değere sahip başka bir öğe olup olmadığını bulmak için bu listenin / dizinin her bir dizininde doğrusal olarak geziniyoruz. Böyle bir değer bulursak, değerleri indekslerinde değiştiririz, yani diyelim ki 15, indeks 1'deki minimum başlangıç ​​değeri ve indekslerin doğrusal geçişi sırasında, daha düşük bir değere sahip bir sayı ile karşılaşırız, örneğin indeks 9'da 7 Şimdi, indeks 9'daki bu 7 değeri, değeri 15 olan indeks 1 ile değiştirilir. Bu geçiş, daha küçük değerle takas etmek için mevcut dizinin değeriyle kalan dizinler ile karşılaştırma yapmaya devam edecektir. Bu, listenin / dizinin ikinci son dizinine kadar devam eder,

Seçim Sıralaması:Listenin / dizinin ilk indeks elemanının sıralandığını varsayalım. Şimdi ikinci dizindeki öğeden, değerin daha küçük olup olmadığını görmek için onu önceki diziniyle karşılaştırıyoruz. Geçiş, sıralı ve sıralanmamış olarak iki parça halinde görselleştirilebilir. Biri, liste / dizideki belirli bir dizin için sıralanmamıştan sıralıya doğru bir karşılaştırma kontrolünü görselleştirmek olabilir. Diyelim ki dizin 1'de 19 değeriniz ve dizin 3'te 10 değeriniz var. Sıralanmamıştan sıralıya, yani sağdan sola geçişi dikkate alıyoruz. Diyelim ki indeks 3'te sıralamak zorundayız. Sağdan sola karşılaştırdığımızda indeks 1'den daha düşük bir değere sahip olduğunu görüyoruz. Bir kez belirlendikten sonra, bu 10 sayısını indeks 3'ün değeri 19 olan indeks 1'in yerine koyarız. Endeks 1'deki orijinal değer 19, bir basamak sağa kaydırılır.

Soru, geçiş yöntemi kavramını anlamakla ilgili göründüğü için herhangi bir kod eklemedim.


0

Ekleme sıralaması bir şeyleri değiştirmez. Bir temp değişkenini kullanmasına rağmen, temp var'ı kullanmanın amacı, bir indekste bir değerin önceki indeksine göre daha az olduğunu bulduğumuzda, büyük değeri daha küçük değerin yerine kaydırırız. şeylerin üzerine yazacak indeks. Daha sonra, önceki dizinde değiştirilecek geçici var'ı kullanırız. Örnek: 10, 20, 30, 50, 40. yineleme 1: 10, 20, 30, 50, 50. [temp = 40] yineleme 2: 10,20, 30, 40 (temp değeri), 50. Yani, biz sadece bir değişkenden istenen konuma bir değer girin.

Ancak seçim sıralamayı düşündüğümüzde, önce daha düşük bir değere sahip olan dizini buluruz ve bu değeri ilk dizinden gelen değerle değiştiririz ve tüm endeksler sıralanana kadar tekrar tekrar değiştirmeye devam ederiz. Bu, iki sayının geleneksel değiş tokuşuyla tamamen aynıdır. Örnek: 30, 20, 10, 40, 50. Yineleme 1: 10, 20, 30, 40, 50. Burada temp var yalnızca takas için kullanılır.


0

Ekleme sıralaması, bu seçimin yerini çok daha fazla değiştirir. İşte bir örnek:

görüntü açıklamasını buraya girin


0

Her ikisinin de ortak noktası, her ikisinin de dizinin sıralı kısmı ile sıralanmamış kısmı ayırt etmek için bir bölüm kullanmasıdır.

Aradaki fark, seçim sıralamasıyla, sıralanan bölüme öğeler eklerken dizinin sıralı bölümünün değişmeyeceğinin garanti edilmesidir.

Bunun nedeni, seçimin sıralanmamış kümenin minimumunu araması ve sıralı kümenin son elemanının hemen sonrasına eklemesi, böylece sıralı kümeyi 1'e yükseltmesidir.

Öte yandan, yerleştirme, yalnızca karşılaşılan bir sonraki öğe ile ilgilenir, bu da dizinin sıralanmamış bölümündeki ilk öğe olur. Bu elemanı alacak ve sıralı sette uygun yerine yerleştirecektir.

Ekleme sıralaması tipik olarak, minimum değeri bulmak için işlemleri boşa harcadığınız için yalnızca kısmen sıralanmış diziler için her zaman daha iyi bir aday olacaktır.

Sonuç:

Seçim sıralaması , sıralanmamış bölümdeki minimum öğeyi bularak aşamalı olarak sona bir öğe ekler.

Ekleme sıralaması , sıralanmamış bölümde bulunan ilk öğeyi sıralanmış bölümdeki herhangi bir yere yayar.


0

Seçim sıralaması ve ekleme sıralamanın Zaman Karmaşıklığı aynı olmasına rağmen, bu n (n - 1) / 2'dir. Ortalama performans ekleme sıralaması daha iyidir. I5 cpu'mda rastgele 30000 tamsayı ile test edildi, seçim sıralaması ortalama 1.5 saniye sürerken, ekleme sıralaması ortalama 0.6 saniye sürüyor.


StackOverflow'a hoş geldiniz ve cevabınız için teşekkür ederiz. Muhtemelen birçok insanın görsel illüstrasyonlarla güzel cevaplara katkıda bulunduğunu görebilirsiniz. Örneğin Nikolay Kostov 7 yıl önce, zaman karmaşıklığının, yerleştirme sıralaması için en kötü durumda aynı olduğunu belirtti. Hatalı olduğunu düşünüyorsanız, yanıtınızı daha fazla ayrıntıyla genişletmenizi rica ederiz.
Maxim Sagaydachny

-1

Meslekten olmayan terimlerle (ve muhtemelen problemi yüksek düzeyde anlamanın en kolay yolu)

Kabarcık sıralaması, bir sıra üzerinde durmaya ve kendinizi yüksekliğe göre sıralamaya benzer. Doğru yere gelene kadar yanınızdaki kişiyle geçiş yapmaya devam edin. Bu, tamamen soldan (veya uygulamaya bağlı olarak sağdan) gerçekleşir ve herkes sıralanana kadar geçiş yapmaya devam edersiniz.

Bununla birlikte, seçim sıralamasında, yaptığınız şey bir el kart düzenlemesine benzer. Kartlara bakarsınız, en küçüğünü alırsınız, sonuna kadar sola yerleştirirsiniz vb.


3
Yine de Seçim ve Ekleme sıralaması arasındaki farkı soruyor
XuDing

-1

seçim - belirli bir öğeyi seçme (en düşük) ve onu i (yineleme yok). öğesi ile değiştirme. (yani birinci, ikinci, üçüncü .......) dolayısıyla sıralı listeyi bir tarafta yapar.

ekleme- birinci ile ikinciyi karşılaştırmak üçüncüyü ikinciyle karşılaştırmak ve ilk dördüncüyü üçüncü, ikinci ve birinciyle karşılaştırmak ......

tüm sıralamaların karşılaştırıldığı bir bağlantı

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.