Seçim Sıralama Java ve Analiz
Java'da bir seçim sıralama kodu yazdım. Algoritmasının çok basit olduğunu biliyorum, ama öğrendiğim için, kodun kalitesi hakkındaki görüşlerinizi çok istedim. Lütfen koda bir göz atın: package 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();
}
}
Ayrıca Analiz hakkında, seçim O (n2) olduğundan, iç içe for döngüsü kullanmamdan kaynaklanıyor. Bize kodun karmaşıklığını anlatan herhangi bir araç var mı? Şimdiden teşekkürler ve çok safsa lütfen sabırlı olun
Yanıtlar
int [] arrayToBeSorted;
Scanner scan=new Scanner(System.in);
Herhangi bir değiştirici olmadan üyeler ve işlevler vardır package-private. Bu, aynı paketten erişilebildikleri, ancak sınıfı genişleten örnekler tarafından erişilebilir olmadığı anlamına gelir. Aslında, nesneye yönelik bir bakış açısından bakıldığında bu son derece tuhaf bir şey. Ya onları yapmak istiyorsunuz ya privateda sınıfları genişletmenin onlara erişebilmesi gerekiyorsa protected,.
Aynı şey yapıcı için de geçerli.
System.out.println("Enter the number of elements");
int total=scan.nextInt();
this.arrayToBeSorted=new int[total];
Bir dizi yerine List/ kullanabilirsiniz ArrayList; bu, sayımı önceden belirtmek zorunda kalmadan kullanıcılardan istedikleri kadar numara alabileceğiniz anlamına gelir. Listenin sonunu bildirmek için boş bir girdi kullanılabilir. Bununla birlikte, bunun Integeryerine kullanmanız gereken dezavantajı var int, bu yüzden 'neyin daha iyi olduğunu söylemek biraz zor. Aynı zamanda boş bir giriş tespit olandan hazır olduğunu dezavantajı var ScannerKullanmak gerekiyordu olarak, nextLinemanuel dönüşüm, bunun için int.
ListDiziyi dinamik olarak büyüterek de a taklit edebilirsiniz . Ya her öğe için bunu yaparak, bu kullanım durumunda performans önemli değil ya da gerektiğinde boyutu iki katına çıkararak.
this.arrayToBeSorted=new int[total];
thisDeğiştiriciye yalnızca aynı kapsamda aynı ada sahip bir değişkeniniz varsa, örneğin bir yapıcıda gereksinim duyarsınız:
public ValueContainer(int value) {
this.value = value;
}
Gerekmiyorsa ihmal etmek yaygın bir uygulamadır this. Bir örnek, statik veya yerel değişkenin kullanılması kafa karıştırıcı bir durumda bulursanız, orada yine de yanlış bir şey yaptınız.
for(int i=0;i<total;i++) {
Döngülerde değişkenler için "gerçek" isimler kullanmak konusunda çok ısrarcı bir savunucuyum.
for (int counter = 0; counter < total; counter++) {
// or
for (int index = 0; index < total; index++) {
public void Sort() {
Java adlandırma kuralları, yöntemlerin / işlevlerin lowerCamelCase olması gerektiğini belirtir.
int minIndex,min;
Şahsen, aynı satırda birden çok değişken bildirmekten kaçınırdım. Beyanı kaçırmayı kolaylaştırır.
boolean swapRequired=false;
Bu, bir değişken için harika bir isim için harika bir örnek, teşekkür ederim!
for(int x:this.arrayToBeSorted) {
System.out.print(x+" ");
}
Bu maalesef değişken için kötü bir isim. Boyutlarla çalışırken yalnızca "x", "y" ve "z" kullanın. "değer" veya "sayı" burada harika bir isim olabilir.
Genel olarak, geçerli görünüyor. Yine de işlevselliği test etmek için çalıştırmadım. Değiştirmeniz gereken şey, yapıcıda mantığınızın olmasıdır. Hiç kimse kurucuların mantıkla dolu olmasını beklemiyor, çünkü onlardan mantığın amacını göremiyorsunuz. Mümkün olduğunca hiçbir şey yapmamalılar. Bu, mantığı içine sortveya daha iyisi içine taşımanız gerektiği anlamına gelir main. Sıralayıcınız girdi ile hiç ilgilenmemeli, ideal olarak yalnızca değerleri sıralamakla ilgilenmeli ve başka bir sınıf ( InputReader?) Girdiyi almakla ilgilenmelidir. Öyleyse yapabileceğiniz şey şuna benzer:
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.
}
Bunun aynı zamanda, durumu hiç tutmanıza gerek kalmaması Sorter, varsayılan olarak iş parçacığı açısından güvenli olmasını sağlayacak bir artıya da sahiptir.