जावास्क्रिप्ट का प्रकार () कैसे काम करता है?


94

निम्नलिखित कोड इस सरणी को संख्यात्मक क्रम में कैसे क्रमबद्ध करता है?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

मुझे पता है कि यदि संगणना का परिणाम है ...

0 से कम : "ए" को "बी" की तुलना में कम सूचकांक होने के लिए क्रमबद्ध किया गया है।
शून्य: "ए" और "बी" को समान माना जाता है, और कोई छंटाई नहीं की जाती है।
0 से अधिक: "बी" को "ए" की तुलना में कम सूचकांक होने के लिए क्रमबद्ध किया गया है।

क्या सरणी प्रकार कॉलबैक फ़ंक्शन को सॉर्ट के दौरान कई बार कहा जाता है?

यदि हां, तो मैं जानना चाहता हूं कि हर बार कौन से दो नंबर फंक्शन में आते हैं। मैंने यह मान लिया कि पहले "25" (ए) और "8" (बी) लिया, उसके बाद "7" (ए) और "41" (बी), इसलिए:

25 (ए) - 8 (बी) = 17 (शून्य से अधिक है, इसलिए "बी" को "ए" से कम इंडेक्स होने के लिए छाँटें): 8, 25

7 (ए) - 41 (बी) = -34 (शून्य से कम, इसलिए "ए" को "बी" से कम इंडेक्स होने के लिए छाँटें: 7, 41)

संख्या के दो सेट कैसे हैं फिर एक दूसरे के संबंध में क्रमबद्ध?

कृपया एक संघर्षपूर्ण नौसिखिया की मदद करें!


5
मुझे आशा है कि यह कुछ समझ में आता है!
cw84

जवाबों:


51

क्या सरणी प्रकार कॉलबैक फ़ंक्शन को सॉर्ट के दौरान कई बार कहा जाता है?

हाँ

यदि हां, तो मैं जानना चाहता हूं कि हर बार कौन से दो नंबर फंक्शन में आते हैं

आप अपने स्वयं के साथ पता लगा सकते हैं:

array.sort((a,b) => {
  console.log(`comparing ${a},${b}`);
  return a > b ? 1
               : a === b ? 0 
                         : -1;
});

संपादित करें

यह वह आउटपुट है जो मुझे मिला है:

25,8
25,7
8,7
25,41

8
बल्कि एक कंसोल .log फायरबग या html DIV तत्व के .innerHTML + = "की तुलना" + ए + "," + बी + "\ n";
जोशुआ

2
याद रखें कि यह एक विकी जैसी साइट है और हम उन्हें बेहतर बनाने के लिए दूसरों के उत्तर संपादित कर सकते हैं :)
पाब्लो फर्नांडीज

7
नए ES6 सिंटैक्स के लिए बस एक नोट: array.sort((a,b) => a - b);मान्य सिंटैक्स है
स्टर्लिंग आर्चर

1
अगर सॉर्ट फ़ंक्शन रिटर्न -ve तो यह स्वैप और + ve है तो यह स्वैप नहीं करता है ??
माही

2
@ShekharReddy आप तुलना करने के लिए अभी भी ऑपरेटरों का उपयोग कर सकते हैं। मैंने जवाब अपडेट कर दिया है।
ऑस्करराइज

44

जावास्क्रिप्ट दुभाषिया में कुछ प्रकार के एल्गोरिथ्म कार्यान्वयन का निर्माण किया गया है। यह छँटाई के संचालन के दौरान तुलनात्मक फ़ंक्शन को कई बार कॉल करता है। तुलनात्मक फ़ंक्शन को कॉल किए जाने की संख्या विशेष एल्गोरिथ्म, सॉर्ट किए जाने वाले डेटा, और सॉर्ट से पहले के क्रम पर निर्भर करती है।

कुछ सॉर्ट एल्गोरिदम पहले से ही सॉर्ट किए गए सूचियों पर खराब प्रदर्शन करते हैं क्योंकि यह उन्हें विशिष्ट मामले की तुलना में कहीं अधिक तुलना करने का कारण बनता है। दूसरों को पूर्व-सॉर्ट की गई सूचियों के साथ अच्छी तरह से सामना करना पड़ता है, लेकिन अन्य मामले हैं जहां उन्हें खराब प्रदर्शन करने में "छल" किया जा सकता है।

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

आपके विशेष जावास्क्रिप्ट दुभाषिया उन एल्गोरिदमों में से एक या पूरी तरह से कुछ और का उपयोग कर सकते हैं। ECMAScript मानक निर्दिष्ट नहीं है जो एल्गोरिथ्म एक अनुरूप क्रियान्वयन उपयोग करना चाहिए। यह स्थिरता की आवश्यकता को भी स्पष्ट रूप से खारिज कर देता है।


1
एफडब्ल्यूआईडब्ल्यू, बुनियादी क्विकसॉर्ट एल्गोरिदम में से एक है जिसे खराब प्रदर्शन करने में "छल" किया जा सकता है। सरल रूप में, इसमें उन सूचियों के लिए O (N ^ 2) प्रदर्शन होता है जो या तो पहले से ही सॉर्ट किए जाते हैं या बिल्कुल उलट होते हैं। अधिकांश लाइब्रेरी क्विकसॉर्ट एल्गोरिदम में कई गैर-स्पष्ट अनुकूलन हैं जो इन सबसे खराब स्थिति से बचने में मदद करते हैं।
Adisak

3
JavaScriptCore वास्तव में छँटाई के लिए एक AVL पेड़ का उपयोग करता है क्योंकि तुलनित्र कार्यों को करने के लिए यह निर्धारित करना आवश्यक है कि सॉर्ट किए जा रहे सरणी को संशोधित करें।
olliej


11

मूल्यों की तुलना की जाती है, एक समय में एक जोड़ी। जिन जोड़ियों की तुलना की जाती है वे एक कार्यान्वयन विवरण हैं - यह नहीं मानें कि वे प्रत्येक ब्राउज़र पर समान होंगे। कॉलबैक कुछ भी हो सकता है (ताकि आप स्ट्रिंग्स या रोमन अंक या कुछ और जहां आप एक फ़ंक्शन के साथ आ सकते हैं जो 1,0, -1 रिटर्न कर सकते हैं)।

जावास्क्रिप्ट के प्रकार को ध्यान में रखने वाली एक बात यह है कि यह स्थिर होने की गारंटी नहीं है।


5

क्या सरणी प्रकार कॉलबैक फ़ंक्शन को सॉर्ट के दौरान कई बार कहा जाता है?

हाँ, बिलकुल ऐसा ही है। कॉलबैक का उपयोग सरणी में तत्वों के जोड़े की तुलना करने के लिए किया जाता है ताकि यह निर्धारित किया जा सके कि उन्हें किस क्रम में होना चाहिए। संख्यात्मक प्रकार के साथ काम करते समय तुलनात्मक फ़ंक्शन का कार्यान्वयन असामान्य नहीं है। में विवरण कल्पना या पर कुछ अन्य अधिक पठनीय साइटों।


4

क्या सरणी प्रकार कॉलबैक फ़ंक्शन को सॉर्ट के दौरान कई बार कहा जाता है?

चूंकि यह एक तुलनात्मक प्रकार है, एन आइटम दिए गए हैं, इसलिए कॉलबैक फ़ंक्शन को क्विकसॉर्ट की तरह तेज क्रम के लिए औसत (एन * एलजी एन) बार पर लागू किया जाना चाहिए । यदि एल्गोरिथ्म का उपयोग बबल सॉर्ट की तरह कुछ है , तो कॉलबैक फ़ंक्शन को औसतन (एन * एन) समय पर लागू किया जाएगा।

तुलनात्मक प्रकार के लिए इनवोकेशन की न्यूनतम संख्या (N-1) है और यह केवल पहले से ही क्रमबद्ध सूची का पता लगाने के लिए है (यानी बबल सॉर्ट में यदि कोई स्वैप नहीं होता है)।


3

गहन ज्ञान

यदि परिणाम ऋणात्मक है a को b से पहले क्रमबद्ध किया जाता है।

यदि परिणाम सकारात्मक है ख एक से पहले हल किया जाता है।

यदि परिणाम 0 है, तो दो मानों के क्रम क्रम के साथ कोई परिवर्तन नहीं किया गया है।

ध्यान दें:

इस कोड को देखते अंदर है प्रकार विधि चरण दर चरण।

उत्पादन:

let arr = [90, 1, 20, 14, 3, 55];
var sortRes = [];
var copy = arr.slice();		//create duplicate array
var inc = 0;	//inc meant increment
copy.sort((a, b) => {
	sortRes[inc] = [ a, b, a-b ];
	inc += 1;
	return a - b;
});
var p = 0;
for (var i = 0; i < inc; i++) {
	copy = arr.slice();
	copy.sort((a, b) => {
		p += 1;
		if (p <= i ) {
			return a - b;
		}
		else{
			return false;
		}
	});
	p = 0;
	console.log(copy +' \t a: '+ sortRes[i][0] +' \tb: '+ sortRes[i][1] +'\tTotal: '+ sortRes[i][2]);
}


0

इस कोड को चलाएं। आप शुरुआत से अंत तक चरणबद्ध प्रक्रिया द्वारा सटीक चरण देख सकते हैं।

var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => { 
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);

कॉपी किया गया और कंसोल पर चिपकाया गया और यह केवल अपरिभाषित वापस आ गया।
iPzard

0

Array#sortइसकी तुलना और इसके तुलनित्र के व्यवहार को स्पष्ट करने में मदद करने के लिए , प्रोग्रामिंग पाठ्यक्रमों की शुरुआत में सिखाए गए इस भोले सम्मिलन के प्रकार पर विचार करें :

const sort = arr => {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j && arr[j-1] > arr[j]; j--) {
      [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
    }
  }
};

const array = [3, 0, 4, 5, 2, 2, 2, 1, 2, 2, 0];
sort(array);
console.log("" + array);

एल्गोरिथ्म के रूप में प्रविष्टि प्रकार की पसंद को अनदेखा करना, हार्डकोडेड तुलनित्र पर ध्यान केंद्रित करें arr[j-1] > arr[j]:। यह चर्चा के लिए प्रासंगिक दो समस्याएं हैं:

  1. >ऑपरेटर सरणी तत्वों लेकिन बहुत सी बातें आप क्रमबद्ध करना वस्तुओं का जवाब नहीं है इस तरह के रूप चाहते हो सकता है के जोड़े पर शुरू हो जाती है >एक उचित तरीके से (यदि हम इस्तेमाल किया भी ऐसा ही होता होगा -)।
  2. यहां तक ​​कि अगर आप संख्याओं के साथ काम कर रहे हैं, तो अक्सर आप आरोही प्रकार की तुलना में कुछ अन्य व्यवस्था चाहते हैं जो यहां बेक किया गया है।

हम इन समस्याओं को एक comparefnतर्क जोड़कर ठीक कर सकते हैं जिनसे आप परिचित हैं:

const sort = (arr, comparefn) => {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j && comparefn(arr[j-1], arr[j]) > 0; j--) {
      [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
    }
  }
};

const array = [3, 0, 4, 5, 2, 2, 2, 1, 2, 2, 0];
sort(array, (a, b) => a - b);
console.log("" + array);

sort(array, (a, b) => b - a);
console.log("" + array);

const objArray = [{id: "c"}, {id: "a"}, {id: "d"}, {id: "b"}];
sort(objArray, (a, b) => a.id.localeCompare(b.id));
console.log(JSON.stringify(objArray, null, 2));

अब भोली प्रकार की दिनचर्या सामान्यीकृत है। आप देख सकते हैं कि यह कॉलबैक कब लागू किया गया है, चिंताओं के अपने पहले सेट का उत्तर देते हुए:

क्या सरणी प्रकार कॉलबैक फ़ंक्शन को सॉर्ट के दौरान कई बार कहा जाता है? यदि हां, तो मैं जानना चाहता हूं कि हर बार कौन से दो नंबर फंक्शन में आते हैं

नीचे दिए गए कोड को चलाने से पता चलता है कि हां, फ़ंक्शन को कई बार कहा जाता है और आप यह console.logदेखने के लिए उपयोग कर सकते हैं कि कौन से नंबर पास किए गए थे:

const sort = (arr, comparefn) => {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j && comparefn(arr[j-1], arr[j]) > 0; j--) {
      [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
    }
  }
};

console.log("on our version:");
const array = [3, 0, 4, 5];
sort(array, (a, b) => console.log(a, b) || (a - b));
console.log("" + array);

console.log("on the builtin:");
console.log("" + 
  [3, 0, 4, 5].sort((a, b) => console.log(a, b) || (a - b))
);

तुम पूछो:

संख्या के दो सेट कैसे हैं फिर एक दूसरे के संबंध में क्रमबद्ध?

शब्दावली के साथ सटीक होने के लिए, aऔर संख्याओं के सेटb नहीं हैं - वे सरणी में ऑब्जेक्ट हैं (आपके उदाहरण में, वे संख्याएं हैं)।

सच्चाई यह है कि यह कोई फर्क नहीं पड़ता कि वे कैसे हल किए जाते हैं क्योंकि यह कार्यान्वयन-निर्भर है। अगर मैंने प्रविष्टि सॉर्ट की तुलना में एक अलग प्रकार के एल्गोरिथ्म का उपयोग किया था, तो तुलनित्र को संभवतः विभिन्न युग्मों की संख्याओं पर लागू किया जाएगा, लेकिन सॉर्ट कॉल के अंत में, जेएस प्रोग्रामर के लिए अपरिवर्तनीय यह है कि परिणाम सरणी के अनुसार क्रमबद्ध है तुलनित्र, तुलनित्र मान मान है कि अनुबंध का पालन करने के लिए कहा जाता है (<0 कब a < b, 0 जब a === bऔर जब 0 0a > b )।

इस अर्थ में कि मुझे अपनी तरह के कार्यान्वयन को बदलने की स्वतंत्रता है जब तक कि मैं अपने विनिर्देश को भंग नहीं करता हूं, ईसीएमएस्क्रिप्ट के कार्यान्वयन भाषा विनिर्देश की सीमाओं के भीतर क्रमबद्ध कार्यान्वयन का चयन करने के लिए स्वतंत्र हैं , इसलिए Array#sortसंभवतः विभिन्न तुलनित्र कॉल का उत्पादन करेंगे। विभिन्न इंजनों पर। कोई ऐसा कोड नहीं लिखेगा जहां तर्क तुलना के कुछ विशेष अनुक्रम पर निर्भर करता है (न ही तुलनाकर्ता को पहले स्थान पर साइड इफेक्ट का उत्पादन करना चाहिए)।

उदाहरण के लिए, V8 इंजन (लेखन के समय) Timsort को तब आमंत्रित करता है जब सरणी कुछ पूर्व- संदूषित तत्वों की संख्या से बड़ी होती है और छोटे सरणी चंक्स के लिए द्विआधारी सम्मिलन प्रकार का उपयोग करती है । हालांकि, यह क्विकॉर्ट का उपयोग करता था जो अस्थिर है और संभवतः तुलनित्र को तर्क और कॉल का एक अलग क्रम देगा।

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


-2
var array=[25, 8, 7, 41]

array.sort(function(a,b){
  console.log(`a = ${a} , b = ${b}`);
  return a - b
});

आउटपुट

  • a = 8, b = 25
  • a = 7, b = 8
  • a = 41, b = 7
  • a = 41, b = 8
  • a = 41, b = 25

मेरे ब्राउज़र में (Google Chrome संस्करण 70.0.3538.77 (आधिकारिक बिल्ड) (64-बिट)) पहली पुनरावृत्ति में, तर्क एक सरणी और तर्क में दूसरा तत्व है बी का पहला तत्व है।

यदि फ़ंक्शन वापस लौटाता है

  1. B से ऋणात्मक मान को आगे ले जाया जाता है a।
  2. पॉजिटिव वैल्यू को b से आगे ले जाया जाता है।
  3. 0 (शून्य) a और b दोनों यथावत रहेंगे।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.