Seleksi Sortir Java dan Analisis

Aug 26 2020

Saya telah menulis kode sortir pilihan di java. Saya tahu algoritme yang sangat dasar, tetapi karena saya sedang belajar, jadi ingin masukan Anda tentang kualitas kode. Silakan lihat kode: 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();
}

}

Juga tentang Analisis, karena seleksi adalah O (n2), apakah itu karena saya menggunakan for loop bersarang. Apakah ada alat yang memberitahu kita tentang kompleksitas kode. Terima kasih sebelumnya dan harap bersabar jika itu sangat naif

Jawaban

1 Bobby Aug 26 2020 at 23:37
int [] arrayToBeSorted;
Scanner scan=new Scanner(System.in);

Tanpa pengubah apa pun, anggota dan fungsi apa pun package-private. Artinya, mereka dapat diakses dari paket yang sama, tetapi tidak dengan instance yang memperluas kelas. Itu adalah hal yang sangat aneh, sebenarnya, ketika melihatnya dari sudut pandang berorientasi objek. Anda ingin membuatnya private, atau jika kelas yang diperluas seharusnya dapat mengaksesnya protected,.

Hal yang sama berlaku untuk konstruktor.


    System.out.println("Enter the number of elements");
    int total=scan.nextInt();
    this.arrayToBeSorted=new int[total];

Anda dapat menggunakan List/ ArrayListsebagai ganti array, yang berarti Anda dapat menerima nomor dari pengguna sebanyak yang mereka inginkan tanpa harus menentukan jumlah sebelumnya. Input kosong dapat digunakan untuk mendeklarasikan akhir daftar. Namun, yang memiliki downside bahwa Anda harus menggunakan Integerbukan int, jadi agak sulit untuk mengatakan apa yang lebih baik. Ini juga memiliki sisi negatif yang mendeteksi input kosong yang sudah tersedia dari Scanner, seperti yang perlu Anda gunakan nextLineuntuk itu, dengan konversi manual ke int.

Anda juga bisa meniru a Listdengan mengembangkan array secara dinamis. Baik dengan melakukannya untuk setiap item, performa tidak menjadi masalah dalam kasus penggunaan ini, atau dengan menggandakan ukuran saat diperlukan.


this.arrayToBeSorted=new int[total];

Anda hanya memerlukan thispengubah jika Anda memiliki variabel dengan nama yang sama dalam lingkup yang sama, misalnya dalam konstruktor:

public ValueContainer(int value) {
    this.value = value;
}

Merupakan praktik umum untuk menghilangkannya thisjika tidak diperlukan. Jika Anda pernah menemukan diri Anda dalam situasi yang membingungkan apakah sebuah instance, variabel statis atau lokal digunakan, Anda tetap melakukan kesalahan di sana.


for(int i=0;i<total;i++) {

Saya sangat gigih menganjurkan penggunaan nama "asli" untuk variabel dalam loop.

for (int counter = 0; counter < total; counter++) {
// or
for (int index = 0; index < total; index++) {

public void Sort() {

Konvensi penamaan Java menyatakan bahwa metode / fungsi harus lowerCamelCase.


int minIndex,min;

Secara pribadi saya akan menghindari mendeklarasikan banyak variabel pada baris yang sama. Itu membuatnya mudah untuk melewatkan deklarasi.


boolean swapRequired=false;

Itu contoh yang bagus dari nama yang bagus untuk sebuah variabel, terima kasih!


    for(int x:this.arrayToBeSorted) {
        System.out.print(x+" ");
    }

Sayangnya, itu adalah nama yang buruk untuk variabel. Hanya gunakan "x", "y" dan "z" saat menangani dimensi. "nilai" atau "angka" akan menjadi nama yang bagus di sini.


Secara keseluruhan, ini terlihat valid. Saya tidak menjalankannya untuk menguji fungsionalitasnya. Apa yang harus Anda ubah adalah Anda memiliki logika di konstruktor. Tidak ada yang mengharapkan konstruktor diisi dengan logika, karena Anda tidak dapat melihat maksud logika dari mereka. Mereka seharusnya tidak melakukan apa-apa. Itu berarti Anda harus memindahkan logika ke sortatau, bahkan lebih baik, ke main. Penyortir Anda tidak boleh peduli dengan masukan sama sekali, itu hanya harus peduli dengan pengurutan nilai, idealnya, dan kelas lain ( InputReader?) Harus peduli dengan mendapatkan masukan. Jadi yang dapat Anda lakukan adalah seperti ini:

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.
}

Itu juga memiliki keuntungan bahwa Anda tidak perlu menahan status Sortersama sekali, yang akan membuatnya aman untuk thread secara default.