Sắp xếp lựa chọn Java và phân tích
Tôi đã viết một mã sắp xếp lựa chọn trong java. Tôi biết thuật toán cơ bản của nó, nhưng vì tôi đang học, nên tôi muốn đầu vào của bạn về chất lượng của mã. Vui lòng xem mã: 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();
}
}
Cũng về Phân tích, vì lựa chọn là O (n2), có phải vì tôi đang sử dụng vòng lặp for lồng nhau. Có công cụ nào cho chúng tôi biết về độ phức tạp của mã không. Cảm ơn trước và hãy kiên nhẫn nếu nó rất ngây thơ
Trả lời
int [] arrayToBeSorted;
Scanner scan=new Scanner(System.in);
Không có bất kỳ sửa đổi nào, các thành viên và chức năng package-private. Có nghĩa là chúng có thể truy cập được từ cùng một gói, nhưng không phải bởi các trường hợp mở rộng lớp. Đó là một điều cực kỳ kỳ lạ, thực sự, khi nhìn nó từ quan điểm hướng đối tượng. Bạn muốn tạo chúng privatehoặc nếu các lớp mở rộng có thể truy cập chúng protected,.
Tương tự đối với hàm tạo.
System.out.println("Enter the number of elements");
int total=scan.nextInt();
this.arrayToBeSorted=new int[total];
Bạn có thể sử dụng a List/ ArrayListthay vì một mảng, có nghĩa là bạn có thể nhận bao nhiêu số từ người dùng tùy thích mà không cần phải chỉ định trước số lượng. Một đầu vào trống có thể được sử dụng để khai báo phần cuối của danh sách. Tuy nhiên, điều đó có nhược điểm là bạn phải sử dụng Integerthay thế int, vì vậy thật khó để phân biệt đâu là loại tốt hơn. Nó cũng có nhược điểm là phát hiện đầu vào trống là có sẵn từ đó Scanner, khi bạn cần sử dụng nextLinecho điều đó, với chuyển đổi thủ công sang int.
Bạn cũng có thể mô phỏng một Listbằng cách phát triển động mảng. Bằng cách làm điều đó cho mọi mục, hiệu suất không quan trọng trong trường hợp sử dụng này hoặc bằng cách tăng gấp đôi kích thước khi cần thiết.
this.arrayToBeSorted=new int[total];
Bạn chỉ yêu cầu thissửa đổi nếu bạn có một biến có cùng tên trong cùng phạm vi, ví dụ: trong một hàm tạo:
public ValueContainer(int value) {
this.value = value;
}
Thông thường bạn nên bỏ qua thisnếu không cần thiết. Nếu bạn từng rơi vào tình huống bối rối giữa việc sử dụng biến thể hiện, biến tĩnh hay biến cục bộ thì bạn đã làm sai ở đó.
for(int i=0;i<total;i++) {
Tôi là một người ủng hộ rất kiên trì cho việc sử dụng tên "thực" cho các biến trong vòng lặp.
for (int counter = 0; counter < total; counter++) {
// or
for (int index = 0; index < total; index++) {
public void Sort() {
Quy ước đặt tên trong Java nêu rõ rằng các phương thức / hàm phải thấp hơnCamelCase.
int minIndex,min;
Cá nhân tôi muốn tránh khai báo nhiều biến trên cùng một dòng. Nó dễ khiến bạn bỏ sót tờ khai.
boolean swapRequired=false;
Đó là một ví dụ tuyệt vời về một cái tên tuyệt vời cho một biến, cảm ơn bạn!
for(int x:this.arrayToBeSorted) {
System.out.print(x+" ");
}
Thật không may, đó là một tên xấu cho một biến. Chỉ sử dụng "x", "y" và "z" khi làm việc với các thứ nguyên. "value" hoặc "number" sẽ là một cái tên tuyệt vời ở đây.
Nhìn chung, nó có vẻ hợp lệ. Tuy nhiên, tôi đã không chạy nó để kiểm tra chức năng. Điều bạn nên thay đổi là bạn có logic trong hàm tạo. Không ai mong đợi các hàm tạo chứa đầy logic, bởi vì bạn không thể thấy mục đích của logic từ chúng. Họ không nên làm gì hết mức có thể. Điều đó có nghĩa là bạn nên chuyển logic vào sorthoặc thậm chí tốt hơn, vào main. Trình sắp xếp của bạn không nên quan tâm đến đầu vào, lý tưởng là nó chỉ nên quan tâm đến việc sắp xếp các giá trị, và một lớp khác ( InputReader?) Nên quan tâm đến việc lấy đầu vào. Vì vậy, những gì bạn có thể làm là một cái gì đó như sau:
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.
}
Điều đó cũng có ưu điểm là bạn không cần phải giữ trạng thái Sorterở tất cả, điều này sẽ làm cho nó an toàn theo mặc định.