मैं हाल ही में किसी के साथ चलना चाहता था कि Array.prototype.sort
किसी भी समय दो मूल्यों की तुलना करने के लिए एक कस्टम विधि का उपयोग करता है, और यह तय करता है कि उन्हें स्वैप किया जाना चाहिए या अकेला छोड़ दिया जाना चाहिए। मैंने प्रत्येक तुलना के दौरान सरणी को लॉग करने का निर्णय लिया ताकि पिछली तुलना का नतीजा देखा जा सके। जब मैंने सरणी को लॉग किया, तो मैंने कुछ क्षणों में सरणी की स्थिति के बारे में कुछ अजीब देखा।Array.prototype.sort अस्थायी रूप से डुप्लिकेटिंग सामग्री?
मान लिया जाये कि निम्नलिखित:
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
}
यह आउटपुट है:
[ 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
सरणी ठीक से ([ 1, 2, 3, 5, 8 ]
) क्रमबद्ध हो जाता है लेकिन मैं अभी भी पर गुजरता में से कुछ पर मेरे सिर खरोंच छोड़ रहा हूँ खुद संग्रह
यह कैसे है कि 8 पुनरावृत्ति 4 पर दो बार दिखाई देता है, 5 अस्थायी रूप से बदलता है। और फिर, 8 दो बार दो पुनरावृत्तियों को बाद में 3 अस्थायी रूप से बदलता है। अंत में, 5 दो बार प्रकट होता है, अस्थायी रूप से अंतिम पुनरावृत्ति में 3 को बदल देता है।
ध्यान दें कि उपरोक्त कोड क्रोम में चलाया गया था।
अब इसे एक लंबी सरणी के साथ आज़माएं। अलग व्यवहार? जांच करें कि 10-आश सीमा में कोई अंतर है या नहीं; सम्मिलन-क्रम-वाई दिखता है। 10+ संभवतः quicksort-y? आईआईआरसी आकार के आधार पर बदलता है, लेकिन कुछ समय पहले मैंने इस बारे में सोचा था। –
@ डेव न्यूटन दिलचस्प विचार, लेकिन 13 आइटमों के साथ यह अभी भी तुलनात्मक अनुक्रमणिका में अस्थायी रूप से डुप्लिकेट सामग्री प्रतीत होता है। ऐसा नहीं माना जाता था कि संग्रह के आकार के आधार पर कार्यान्वयन बदल सकता है। – Sampson
और यह कभी भी आइटम नहीं है 'console.log (ए, बी, संख्या); ' –