चयन सॉर्टिंग Java उदाहरण सहित कार्यक्रम

⚡ स्मार्ट सारांश

चयन क्रमबद्ध करें Java यह सरणी के अव्यवस्थित भाग को बार-बार स्कैन करता है, शेष सबसे छोटा मान ढूंढता है, और उसे उसकी स्थिति में स्वैप कर देता है, इनपुट क्रम की परवाह किए बिना अधिकतम n-1 विनिमय के साथ काम पूरा करता है।

  • 🔘 परिभाषा: सिलेक्शन सॉर्ट प्रत्येक पास में ऐरे को एक सॉर्टेड क्षेत्र और एक अनसॉर्टेड क्षेत्र में विभाजित करता है।
  • प्रक्रिया: प्रत्येक चरण में अव्यवस्थित क्षेत्र में सबसे छोटे तत्व की खोज की जाती है और उसे आगे की ओर बदल दिया जाता है।
  • कार्यक्रम: RSI Java उदाहरण के लिए, {860, 8, 200, 9} को सॉर्ट करें और प्रत्येक तुलना और अदला-बदली को प्रिंट करें।
  • 🧪 जटिलता: सर्वोत्तम, औसत और सबसे खराब स्थिति सभी O(n²) समय में चलती हैं क्योंकि तुलना की संख्या कभी कम नहीं होती है।
  • मेमोरी: एक्सचेंज मूल ऐरे के अंदर होते हैं, इसलिए सहायक स्थान O(1) पर बना रहता है।
  • 📊 व्यवहार: क्लासिक संस्करण अस्थिर है, फिर भी यह किसी भी द्विघात सॉर्ट की तुलना में सबसे कम राइट ऑपरेशन करता है।

चयन सॉर्टिंग Java उदाहरण सहित कार्यक्रम

चयन सॉर्ट कैसे काम करता है?

चयन सॉर्ट एक सरल सॉर्टिंग एल्गोरिथ्म को इस प्रकार कार्यान्वित करता है:

  • एल्गोरिथ्म बार-बार सबसे कम तत्व की खोज करता है।
  • वर्तमान तत्व को सबसे कम मान वाले तत्व से बदलें
  • चयन सॉर्ट के प्रत्येक पुनरावृत्ति/पास के साथ, तत्वों की अदला-बदली हो जाती है।

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

क्योंकि प्रति पास केवल एक ही अदला-बदली होती है, इसलिए n तत्वों की एक सरणी को अधिकतम n-1 अदला-बदली के बाद क्रमबद्ध किया जाता है। यही विशेषता इस रूटीन को अन्य शुरुआती स्तर के रूटीन से अलग करती है। Java सॉर्टिंग एल्गोरिदम, जो डेटा को कहीं अधिक बार स्थानांतरित करते हैं।

RSI tracनीचे दिया गया उदाहरण {860, 8, 200, 9} नामक सैंपल एरे को ठीक उसी तरह दिखाता है जैसे अगले सेक्शन में दिया गया प्रोग्राम रन टाइम पर प्रिंट करता है।

पास मुद्रित तुलनाएँ सबसे छोटा मान पाया गया स्वैप के बाद ऐरे
प्रारंभ - - 860 8 200 9
1 860 और 8, 8 और 200, 8 और 9 8 8 860 200 9
2 860 और 200, 200 और 9 9 8 9 200 860
3 200 और 860 200 8 9 200 860

उसमें दो बातें हैं tracकुछ बिंदुओं पर ध्यान देना आवश्यक है। पहला, तीसरे चरण में क्रम में कोई परिवर्तन न होने के बावजूद भी अदला-बदली की सूचना मिलती है, क्योंकि शेष सबसे छोटा मान पहले से ही वर्तमान सूचकांक पर मौजूद है और प्रोग्राम तत्व को स्वयं से बदल देता है। दूसरा, प्रत्येक चरण में तुलनाओं की संख्या एक-एक करके घटती जाती है (तीन, फिर दो, फिर एक), जो पृष्ठ पर आगे दिए गए जटिलता आंकड़ों के पीछे का पैटर्न है।

Java चयन सॉर्ट को लागू करने के लिए कार्यक्रम

नीचे दी गई क्लास का नाम SelectionSortAlgo है और यह com.guru99 पैकेज में स्थित है। main() मेथड सैंपल ऐरे को डिक्लेयर करता है, उसे प्रिंट करता है, सॉर्टिंग के लिए selection() मेथड को सौंपता है और फिर से प्रिंट करता है। सहायक printArray() मेथड सभी एलिमेंट्स को एक ही लाइन में लिखता है, जिससे पठनीय पास-बाय-पास लॉग बनता है।

selection() फ़ंक्शन के अंदर, बाहरी लूप सॉर्ट किए गए और अनसॉर्ट किए गए क्षेत्रों के बीच की सीमा को चिह्नित करता है, वेरिएबल index अब तक देखे गए सबसे छोटे मान की स्थिति को रखता है, और प्रत्येक पास के अंत में तीन असाइनमेंट स्वैप करते हैं।

package com.guru99;
 
public class SelectionSortAlgo {
 
	public static void main(String a[])
	{  
		int[] myArray = {860,8,200,9}; 
		
		System.out.println("------Before Selection Sort-----");
 
		printArray(myArray);
 
 
		selection(myArray);//sorting array using selection sort  
 
		System.out.println("-----After Selection Sort-----");  
 
		printArray(myArray); 
	} 
	
		public static void selection(int[] array)
	{  
		for (int i = 0; i < array.length - 1; i++)  
		{  System.out.println("Sort Pass Number "+(i+1));
			int index = i;  
			for (int j = i + 1; j < array.length; j++)
			{   
			    System.out.println("Comparing "+ array[index]  + " and " + array[j]);  
				if (array[j] < array[index]){ 
				System.out.println(array[index]  + " is greater than " + array[j] );
					index = j;
				
				
				}  
			}  
 
			int smallerNumber = array[index];   
			array[index] = array[i];  
			array[i] = smallerNumber;  
			System.out.println("Swapping Elements: New Array After Swap");
			printArray(array);
		}  
	}  
	static void printArray(int[] array){
	    
	    for(int i=0; i < array.length; i++)
		{  
			System.out.print(array[i] + " ");  
		} 
	    System.out.println();
	    
	}
 
}

आउटपुट:

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

------Before Selection Sort-----
860 8 200 9 
Sort Pass Number 1
Comparing 860 and 8
860 is greater than 8
Comparing 8 and 200
Comparing 8 and 9
Swapping Elements: New Array After Swap
8 860 200 9 
Sort Pass Number 2
Comparing 860 and 200
860 is greater than 200
Comparing 200 and 9
200 is greater than 9
Swapping Elements: New Array After Swap
8 9 200 860 
Sort Pass Number 3
Comparing 200 and 860
Swapping Elements: New Array After Swap
8 9 200 860 
-----After Selection Sort-----
8 9 200 860

इस उदाहरण को पहली बार चलाने पर शुरुआती लोगों को दो समस्याओं का सामना करना पड़ता है। क्योंकि फ़ाइल घोषित करती है package com.guru99;स्रोत को एक मेल खाने वाले स्थान पर रहना चाहिए। com/guru99 यदि क्लास को डायरेक्ट्री में नहीं रखा जाता है, तो कंपाइलर पैकेज या क्लास-नाम बेमेल होने की रिपोर्ट करेगा। ऐसे में क्लास को उसके पूर्ण रूप से योग्य नाम से लॉन्च किया जाना चाहिए। java com.guru99.SelectionSortAlgoक्योंकि सादा java SelectionSortAlgo NoClassDefFoundError उत्पन्न करता है।

लूप की सीमाएँ एक और आम समस्या हैं। बाहरी लूप यहाँ रुक जाता है। array.length - 1 और आंतरिक लूप यहाँ से शुरू होता है i + 1किसी भी सीमा को बदलने से एक अतिरिक्त खाली पास उत्पन्न होता है या ArrayIndexOutOfBoundsException उत्पन्न होता है।

चयन क्रम की समय और स्थान जटिलता

प्रोग्राम का आंतरिक लूप हमेशा ऐरे के अंत तक चलता है, इसलिए एल्गोरिदम डेटा के स्वरूप के बावजूद समान संख्या में तुलनाएँ करता है। n तत्वों वाले ऐरे के लिए यह कुल संख्या n(n-1)/2 होती है, जो चार तत्वों वाले नमूने के लिए छह के बराबर होती है, और ऊपर दिया गया आउटपुट वास्तव में छह "तुलना" पंक्तियाँ प्रिंट करता है।

मामला तुलना स्वैप समय की जटिलता सहायक स्थान
सर्वश्रेष्ठ (एरे पहले से ही क्रमबद्ध है) एन(एन-1)/2 N-1 ओ (एन²) ओ (1)
औसत (यादृच्छिक क्रम) एन(एन-1)/2 N-1 ओ (एन²) ओ (1)
सबसे खराब (उल्टे क्रम में) एन(एन-1)/2 N-1 ओ (एन²) ओ (1)

उन समान आकृतियों की पंक्ति से तीन परिणाम निकलते हैं:

  • सिलेक्शन सॉर्टिंग अनुकूलनशील नहीं है। सॉर्ट किए गए इनपुट की लागत ठीक उतनी ही होती है जितनी कि उल्टे इनपुट की, इसलिए इसमें जल्दी बाहर निकलने का कोई शॉर्टकट नहीं है। बबल शॅाट प्रदान करता है।
  • स्वैप काउंट इस एल्गोरिदम की सबसे बड़ी खूबी है। इसमें अधिकतम n-1 एक्सचेंज होते हैं, जो कि अन्य सरल सॉर्ट्स द्वारा किए जाने वाले मूव्स की वर्ग संख्या से कहीं कम है।
  • मेमोरी का उपयोग स्थिर है। केवल लूप काउंटर और दो अस्थायी चर index और smallerNumber की आवश्यकता होती है, इसलिए सहायक स्थान O(1) है और सॉर्टिंग उसी स्थान पर होती है।

व्यावहारिक सीमा द्विघात वृद्धि है। ऐरे के आकार को दोगुना करने से तुलना का कार्य लगभग चार गुना हो जाता है, इसलिए सिलेक्शन सॉर्ट शिक्षण, छोटे ऐरे और एम्बेडेड कोड के लिए उपयुक्त है, न कि उत्पादन डेटा सेट के लिए, जहाँ O(n log n) एल्गोरिदम सही विकल्प हैं।

चयन क्रम के लाभ और हानियाँ

यह समझना कि एल्गोरिदम कहाँ मदद करता है और कहाँ नुकसान पहुँचाता है, यह तय करना आसान बना देता है कि इसका उपयोग कब उचित है।

फायदे

  • इसका तर्क संक्षिप्त और पठनीय है, यही कारण है कि यह एक मानक प्रारंभिक छँटाई अभ्यास है। सम्मिलन सॉर्ट.
  • यह डेटा को उसी स्थान पर सॉर्ट करता है, इसलिए किसी दूसरे ऐरे को आवंटित नहीं किया जाता है और इनपुट के साथ मेमोरी का उपयोग नहीं बढ़ता है।
  • यह ऐरे में अधिकतम n-1 बार ही लिखता है, जो ऐसे स्टोरेज पर मायने रखता है जहां लिखने की प्रक्रिया धीमी होती है या माध्यम को खराब कर देती है।
  • इसका चलने का समय पूरी तरह से अनुमानित है, क्योंकि तुलनाओं की संख्या केवल ऐरे की लंबाई पर निर्भर करती है।

नुकसान

  • प्रत्येक मामला O(n²) है, इसलिए एल्गोरिदम बड़े संग्रहों के लिए उपयुक्त नहीं है।
  • यह पहले से सॉर्ट किए गए ऐरे का पता नहीं लगा सकता है और इसलिए कभी भी समय से पहले समाप्त नहीं होता है।
  • ऊपर दिखाया गया क्लासिक रूप अस्थिर है, इसलिए दो बराबर मान विपरीत क्रम में आ सकते हैं।
  • यह लगभग क्रमबद्ध डेटा पर इंसर्शन सॉर्ट की तुलना में अधिक बार तुलना करता है, जहां इंसर्शन सॉर्ट रैखिक समय के करीब पहुंचता है।

संक्षेप में, सिलेक्शन सॉर्ट का चुनाव तब करें जब ऐरे छोटा हो और प्रत्येक राइट प्रक्रिया महंगी हो, और जब डेटा सेट बड़ा हो या पहले से ही सॉर्टेड के करीब हो तो इससे बचें।

चयन क्रम बनाम Bubblई सॉर्ट बनाम इंसर्शन सॉर्ट

ये तीनों एल्गोरिदम द्विघात, इन-प्लेस तुलना सॉर्ट हैं, फिर भी इनपुट का आकार बदलने पर वे अलग तरह से व्यवहार करते हैं।

कसौटी चयन छांटना Bubblई सॉर्ट सम्मिलन सॉर्ट
सर्वोत्तम स्थिति समय ओ (एन²) पर) पर)
औसत और सबसे खराब स्थिति का समय ओ (एन²) ओ (एन²) ओ (एन²)
सबसे खराब स्थिति में अदला-बदली या बदलाव। एन-1 स्वैप n(n-1)/2 स्वैप n(n-1)/2 शिफ्ट तक
स्थिर नहीं हाँ हाँ
क्रमबद्ध इनपुट के अनुकूल नहीं हाँ हाँ
सहायक स्थान ओ (1) ओ (1) ओ (1)
विशिष्ट उपयोग सबसे कम लेखन की आवश्यकता क्रमबद्ध डेटा को सिखाना और पहचानना छोटे या लगभग क्रमबद्ध सरणियाँ

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

अक्सर पूछे जाने वाले प्रश्न

n-1 पास के बाद, अव्यवस्थित क्षेत्र में केवल एक ही तत्व बचता है, और वह अकेला तत्व पहले से ही अपने सही स्थान पर मौजूद होता है। एक और पास चलाने से किसी चीज़ की तुलना नहीं होगी, इसलिए लूप की सीमा एक अनावश्यक पुनरावृति से बचाती है।

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

हां. गिटहब कोपिलॉट यह विधि किसी हस्ताक्षर या टिप्पणी से पूरी होती है। आंतरिक लूप की शुरुआत और स्वैप लाइनों की स्वयं जाँच करें, क्योंकि जनरेट किए गए संस्करण कभी-कभी संग्रहीत न्यूनतम सूचकांक के बजाय i के साथ स्वैप करते हैं।

यहां दिखाया गया संस्करण अस्थिर है, क्योंकि लंबी दूरी की अदला-बदली एक समान मान को दूसरे से आगे छोड़ सकती है। Shiftस्वैप करने के बजाय तत्वों के ब्लॉक को स्थानांतरित करनाping यह समान कुंजियों के मूल क्रम को संरक्षित रखता है, लेकिन इसके लिए अतिरिक्त लेखन की आवश्यकता होती है।

Reverse आंतरिक लूप के अंदर तुलना। यह जांचना कि क्या array[j] array[index] से बड़ा है। tracks सबसे बड़ा शेष मान है, इसलिए प्रत्येक पास अधिकतम मान को आगे बढ़ाता है और अंतिम सरणी उच्च से निम्न तक चलती है।

हाँ। एक रिकर्सिव विधि वर्तमान सबएरे का न्यूनतम मान ज्ञात करती है, उसे सबसे आगे रखती है, और फिर शेष मानों पर स्वयं को कॉल करती है। तुलनाओं की संख्या अपरिवर्तित रहती है, लेकिन कॉल स्टैक O(n) स्थान जोड़ता है, इसलिए लूप विधि को प्राथमिकता दी जाती है।

बार-बार होने वाली गलतियाँ प्रत्येक पास की शुरुआत में इंडेक्स को i पर रीसेट करना भूल जाना, आंतरिक लूप को i + 1 के बजाय i से शुरू करना और स्वैप करना हैं।ping array[index] के बजाय array[j] का प्रयोग करने से हानि होती है। tracसबसे छोटे मान का k।

नहीं। Arrays.sort() प्रिमिटिव्स पर ड्यूल-पिवट क्विकसॉर्ट और ऑब्जेक्ट्स पर टिमसॉर्ट लागू करता है, साथ ही छोटे विभाजनों पर इंसर्शन-स्टाइल सॉर्ट भी लागू करता है। सिलेक्शन सॉर्ट मानक लाइब्रेरी में न होकर शिक्षण सामग्री और हस्तलिखित कोड में ही दिखाई देता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: