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.
Ş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. –
@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
Ve hiçbir zaman şu anda kontrol edilen öğeler 'console.log (a, b, num);' –