2013-10-08 6 views
5

मैं हाल ही में किसी के साथ चलना चाहता था कि 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 को बदल देता है।

ध्यान दें कि उपरोक्त कोड क्रोम में चलाया गया था।

+0

अब इसे एक लंबी सरणी के साथ आज़माएं। अलग व्यवहार? जांच करें कि 10-आश सीमा में कोई अंतर है या नहीं; सम्मिलन-क्रम-वाई दिखता है। 10+ संभवतः quicksort-y? आईआईआरसी आकार के आधार पर बदलता है, लेकिन कुछ समय पहले मैंने इस बारे में सोचा था। –

+0

@ डेव न्यूटन दिलचस्प विचार, लेकिन 13 आइटमों के साथ यह अभी भी तुलनात्मक अनुक्रमणिका में अस्थायी रूप से डुप्लिकेट सामग्री प्रतीत होता है। ऐसा नहीं माना जाता था कि संग्रह के आकार के आधार पर कार्यान्वयन बदल सकता है। – Sampson

+0

और यह कभी भी आइटम नहीं है 'console.log (ए, बी, संख्या); ' –

उत्तर

2

दिलचस्प, लेकिन बहुत आश्चर्यजनक नहीं।

ऐसा लगता है कि यह इस उदाहरण में एक सरल सम्मिलन-प्रकार एल्गोरिदम का उपयोग कर रहा है।

की तर्ज पर कुछ:

  • प्राप्त आइटम [1]
  • शिफ्ट यह नीचे दिए हर आइटम एक आप किसी आइटम कम है कि लगता है जब तक है, तो इस आइटम के ऊपर डाल
  • आइटम प्राप्त करें [ 2]
  • शिफ्ट हर आइटम नीचे इसे एक आप किसी आइटम कम है कि लगता है जब तक है, तो यह इस आइटम के ऊपर डाल
  • जाओ आइटम [3]
  • (शेष भाग)

बबल सॉर्ट एल्गोरिदम का वर्णन करते समय, आप आमतौर पर कल्पना करते हैं कि प्रत्येक तत्व को सरणी के साथ स्वैप किया जा रहा है जब तक कि उसे इसकी जगह न मिल जाए। लेकिन इसे स्वैप करने के बजाय आइटम को एक अस्थायी चर में स्टोर करना अधिक कुशल है।

+0

मैंने इसे माना था, लेकिन कोई कारण नहीं मिल रहा है कि क्यों कुछ पुनरावृत्तियों के परिणामस्वरूप डुप्लिकेट मूल्य होंगे, जबकि अन्य नहीं होंगे।यदि प्रत्येक पुनरावृत्ति के परिणामस्वरूप डुप्लिकेट मान होते हैं, तो सुधार के बाद, यह मेरे लिए अधिक स्पष्ट लग रहा होता। – Sampson

+0

बबल प्रकार के इस विशेष संस्करण को आम तौर पर "इंसियरियन सॉर्ट" कहा जाता है –

+0

@ जोनाथन सैम्पसन केवल बाएं स्थानांतरित करने वाले तत्व अस्थायी रूप से डालने के लिए अस्थायी रूप से हटाए जाते हैं –

संबंधित मुद्दे