2013-10-08 34 views
5

Geçenlerde Array.prototype.sort herhangi bir zamanda iki değeri karşılaştırmak için özel bir yöntem kullanır nasıl Birisini yürümek ve onlar takas veya yalnız bırakılmalıdır karar vermek istedik. Her karşılaştırma sırasında diziyi kaydetmeye karar verdim, böylece önceki karşılaştırmanın sonucu görülebildi. Diziyi kaydettiğimde, dizinin durumu hakkında belirli anlarda garip bir şey fark ettim.Array.prototype.sort Geçici Olarak İçeriği Çoğaltma?

varsayarsak aşağıdaki:

var num = [ 2, 1, 8, 5, 3 ]; 

num.sort(comparator); 

function comparator (a, b) { 
    console.log(num); // Current state of num 
    return a - b; // Order values numerically 
} 

Bu çıkış ise:

[ 2, 1, 8, 5, 3 ] // Comparing 2 and 1 
[ 1, 2, 8, 5, 3 ] // Comparing 2 and 8 
[ 1, 2, 8, 5, 3 ] // Comparing 8 and 5 
[ 1, 2, 8, 8, 3 ] // Comparing 2 and 5 
[ 1, 2, 5, 8, 3 ] // Comparing 8 and 3 
[ 1, 2, 5, 8, 8 ] // Comparing 5 and 3 
[ 1, 2, 5, 5, 8 ] // Comparing 2 and 3 

dizisi düzgün ([ 1, 2, 3, 5, 8 ]) sıralanır ama hala üzerinde paso bazı başımı kaşıma kaldım koleksiyon kendisi.

Nasıl 8 geçici 5 yerine yineleme 4 iki defa görünüyorsa o kadar. Ve yine 8, iki kez tekrarlanan iki iterasyon daha sonra 3 geçici olarak değiştirir. Son olarak, 5 son yinelemede geçici olarak 3 yerine iki kez görünür. Yukarıdaki kod Chrome'da koştu edildi

Not.

+0

Şimdi daha uzun bir dizi ile deneyin. Farklı davranış? 10-ish sınırı boyunca bir fark olup olmadığını kontrol edin; ekleme-sıralama-y görünüyor. 10 + muhtemelen quicksort-y? IIRC, büyüklüğüne bağlı olarak değişir, ama bir süre önce bunu düşündüm. –

+0

@DaveNewton İlginç bir fikir, ancak 13 maddeyle hala içeriklerin karşılaştırıldığı endeksler arasında geçici olarak kopyalanıyor gibi görünüyor. Uygulamanın, koleksiyonun büyüklüğüne bağlı olarak değişebileceğini düşünmemiştim. – Sampson

+0

Ve hiçbir zaman şu anda kontrol edilen öğeler 'console.log (a, b, num);' –

cevap

2

İlginç, ama çok şaşırtıcı değil.

Bu durumda, basit bir sokma-sıralama algoritması kullanılarak görünmektedir. çizgisinde

şey:

  • alın öğesi [1]
  • Shift altındaki her öğe kadar bir daha düşük olan bir öğeyi buluncaya kadar, o zaman bu öğesinin üzerinde koymak
  • [öğeyi alın 2]
  • Shift her öğe daha düşük olan bir öğeyi bulana kadar o kadar bir, o zaman bu öğesinin üzerinde koymak altında
  • alın madde [3]
  • (devam)

Kabarcık sıralama algoritmasını açıklarken, genellikle, her öğenin, diziyi yer bulana kadar dizide değiştirildiğini düşünürsünüz. Ancak, öğeyi değiştirmekten daha geçici bir değişkene depolamak daha verimlidir.

+0

Bunu düşünmüştüm, ancak bazı yinelemelerin çoğaltılmış değerlerle sonuçlanmasına neden olurken, diğerlerinin yapamayacağı bir neden bulamıyor.Her yineleme yinelenen değerler ile sonuçlandıysa, bunu bir düzeltme takip ettiyse, bu benim için daha açık görünebilirdi. – Sampson

+0

Kabarcık sıralamasının bu özel sürümü normalde "inserion sort" olarak adlandırılır –

+0

@JonathanSampson sadece sola hareket eden elemanlar geçici olarak insert-sort –

İlgili konular