चयन सॉर्ट जावा और विश्लेषण
मैंने जावा में एक चयन प्रकार कोड लिखा है। मुझे पता है कि इसका बहुत ही प्रारंभिक एल्गोरिथ्म है, लेकिन चूंकि मैं सीख रहा हूं, इसलिए कोड की गुणवत्ता के बारे में आपका इनपुट चाहता था। कृपया कोड पर एक नज़र डालें: पैकेज Selection_sort;
import java.util.Scanner;
public class SelectionSort {
int [] arrayToBeSorted;
Scanner scan=new Scanner(System.in);
SelectionSort(){
System.out.println("Enter the number of elements");
int total=scan.nextInt();
this.arrayToBeSorted=new int[total];
for(int i=0;i<total;i++) {
System.out.println("Enter the "+i+" number of elements");
this.arrayToBeSorted[i]=scan.nextInt();
}
}
public void Sort() {
int minIndex,min;
boolean swapRequired=false;
for(int i=0;i<arrayToBeSorted.length;i++) {
minIndex=i;
min=this.arrayToBeSorted[i];
for(int j=i+1;j<this.arrayToBeSorted.length;j++) {
if(this.arrayToBeSorted[j]<min) {
min=this.arrayToBeSorted[j];
minIndex=j;
swapRequired=true;
}
}
if(swapRequired) {
swap(i,minIndex);
}
}
for(int x:this.arrayToBeSorted) {
System.out.print(x+" ");
}
}
public void swap(int i,int j) {
//System.out.println("swap called, pos="+i+"and minindex="+j);
int temp=this.arrayToBeSorted[i];
this.arrayToBeSorted[i]=this.arrayToBeSorted[j];
this.arrayToBeSorted[j]=temp;
//System.out.println("------------");
}
public static void main(String[] args) {
SelectionSort s=new SelectionSort();
s.Sort();
}
}
विश्लेषण के बारे में भी, जैसा कि चयन हे (n2) है, क्या यह इसलिए है क्योंकि मैं लूप के लिए नेस्टेड का उपयोग कर रहा हूं। क्या कोई उपकरण है जो हमें कोड की जटिलता के बारे में बताता है। अग्रिम में धन्यवाद और अगर बहुत भोला हो तो कृपया धैर्य रखें
जवाब
int [] arrayToBeSorted;
Scanner scan=new Scanner(System.in);
किसी भी संशोधक के बिना, सदस्य और कार्य हैं package-private। जिसका अर्थ है कि वे एक ही पैकेज से सुलभ हैं, लेकिन कक्षा का विस्तार करने वाले उदाहरणों से नहीं। यह एक बहुत ही अजीब बात है, वास्तव में, जब इसे वस्तु-उन्मुख दृष्टिकोण से देखते हैं। आप या तो उन्हें बनाना चाहते privateहैं, या विस्तार वर्गों द्वारा उन्हें ऐक्सेस करने में सक्षम होना चाहिए अगर protected।
वही कंस्ट्रक्टर के लिए जाता है।
System.out.println("Enter the number of elements");
int total=scan.nextInt();
this.arrayToBeSorted=new int[total];
आप किसी सरणी के बजाय List/ का उपयोग कर सकते हैं ArrayList, जिसका अर्थ होगा कि आप उपयोगकर्ताओं से उतने ही नंबर प्राप्त कर सकते हैं जितने कि वे पहले से गिनती निर्दिष्ट किए बिना चाहते हैं। सूची के अंत की घोषणा के लिए एक खाली इनपुट का उपयोग किया जा सकता है। हालाँकि, इसका नकारात्मक पहलू यह है कि आपको Integerइसके स्थान पर उपयोग करना चाहिए int, इसलिए यह बताना कठिन है कि क्या बेहतर है। इसमें एक नकारात्मक पहलू यह भी है कि खाली इनपुट का पता लगाने से यह आसानी से उपलब्ध है Scanner, क्योंकि आपको इसके nextLineलिए मैन्युअल रूपांतरण के साथ उपयोग करना होगा int।
आप Listसरणी को गतिशील रूप से बढ़ाकर भी अनुकरण कर सकते हैं । या तो प्रत्येक आइटम के लिए ऐसा करने से, इस उपयोग-मामले में प्रदर्शन मायने नहीं रखता है, या आवश्यकता होने पर आकार दोगुना हो जाता है।
this.arrayToBeSorted=new int[total];
thisयदि आप एक ही नाम के साथ एक चर में एक चर में उदाहरण के लिए, आप केवल संशोधक की आवश्यकता है :
public ValueContainer(int value) {
this.value = value;
}
thisजरूरत न होने पर इसे छोड़ देना आम बात है । यदि आप कभी भी अपने आप को इस स्थिति में पाते हैं कि यह भ्रामक है कि क्या कोई उदाहरण, स्थिर या स्थानीय चर का उपयोग किया जाता है, तो आपने वहाँ कुछ भी गलत किया।
for(int i=0;i<total;i++) {
मैं लूप में वेरिएबल्स के लिए "वास्तविक" नामों का उपयोग करने के लिए बहुत निरंतर वकील हूं।
for (int counter = 0; counter < total; counter++) {
// or
for (int index = 0; index < total; index++) {
public void Sort() {
जावा नामकरण सम्मेलनों में कहा गया है कि विधियाँ / कार्य निम्न प्रकार से होने चाहिए।
int minIndex,min;
व्यक्तिगत रूप से मैं एक ही पंक्ति में कई चर घोषित करने से बचूंगा। यह घोषणा को याद करना आसान बनाता है।
boolean swapRequired=false;
यह एक चर के लिए एक महान नाम का एक शानदार उदाहरण है, धन्यवाद!
for(int x:this.arrayToBeSorted) {
System.out.print(x+" ");
}
यह दुर्भाग्य से, एक चर के लिए एक बुरा नाम है। आयामों के साथ काम करते समय केवल "x", "y" और "z" का उपयोग करें। "मान" या "संख्या" यहां एक बड़ा नाम होगा।
कुल मिलाकर, यह वैध दिखता है। मैंने इसे कार्यक्षमता का परीक्षण करने के लिए नहीं चलाया, हालाँकि। आपको जो बदलना चाहिए वह यह है कि आपके पास कंस्ट्रक्टर में तर्क है। कोई भी उम्मीद नहीं करता कि निर्माणकर्ता तर्क से भरे होंगे, क्योंकि आप उनसे तर्क की मंशा नहीं देख सकते। उन्हें यथासंभव कुछ नहीं करना चाहिए। इसका मतलब है कि आपको तर्क को sortया उससे भी बेहतर, में स्थानांतरित करना चाहिए main। आपके सॉर्टर को इनपुट के साथ बिल्कुल भी चिंतित नहीं होना चाहिए, यह केवल क्रमबद्ध मानों के साथ संबंधित होना चाहिए, आदर्श रूप से, और एक अन्य वर्ग ( InputReader?) इनपुट प्राप्त करने से संबंधित होना चाहिए। तो आप क्या कर सकते हैं कुछ इस तरह है:
public static final void main(String[] args) {
InputReader inputReader = new InputReader();
int[] values = inputReader.readValues();
Sorter sorter = new Sorter();
sorter.sort(value);
// TODO Print sorted output.
}
इसका उल्टा यह भी है कि आपको राज्य को धारण करने की आवश्यकता नहीं है Sorter, जो इसे डिफ़ॉल्ट रूप से थ्रेड-सुरक्षित बना देगा।