어제 정렬 알고리즘 비교에 대한 멋진 비디오를 보았습니다. 나는 똑같이 쓰기로 결정했지만 시작 직후이 정렬 시각화가 엄청나게 느리다는 것을 알았습니다. 이 코드로
import javax.swing.*;
import java.awt.*;
class ViewSort extends JFrame implements Runnable{
private int N = 100;
private int max = 500;
private int[] array;
private Thread th;
private DrawPanel drawPanel;
long startTime;
int iter = 0;
public ViewSort(){
init();
}
private void init(){
this.setSize(N*2 + 50, max + 50);
this.setLayout(new GridLayout(1, 1));
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Stupid Sort Viewer");
drawPanel = new DrawPanel();
this.getContentPane().add(drawPanel);
array = generateArray(N, max);
th = new Thread(this);
th.start();
startTime = System.nanoTime();
}
public static int[] generateArray(int N, int max){
int[] array = new int[N];
for(int i = 0; i < N; i++){
array[i] = (int) (Math.random() * max);
}
return array;
}
@Override
public void run(){
for(int i = 0; i < N - 1; i++){
iter++;
if(array[i] > array[i + 1]){
int tmp = array[i];
array[i] = array[i + 1];
array[i + 1] = tmp;
i = 0;
}
try{
th.sleep(1);
}catch(InterruptedException ie){
ie.printStackTrace();
}
drawPanel.repaint();
}
System.out.print((System.nanoTime() - startTime) / 1000 / 1000 / 1000);
System.out.print(" seconds left on ");
System.out.print(iter);
System.out.print(" iterations on sorting an array of ");
System.out.print(N);
System.out.print(" integers");
}
private void printArray(){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++){
sb.append(array[i]);
sb.append(" ");
}
System.out.println(new String(sb));
}
class DrawPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.white);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.black);
for(int i = 0; i < N; i++){
g.fillRect(i*2 + 25, getHeight() - array[i], 2, array[i]);
}
}
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new ViewSort().setVisible(true);
}
});
}
}
이 코드를 사용하면
100 개의 정수 배열을 정렬 할 때 116441 반복에 170 초가 남았습니다.
PS
정렬이 가장 느리다는 것을 알고 있지만 (무작위 정렬 제외) 그렇지 않습니다!
i = 0;
위의 줄로 인해 두 가지 문제가 있습니다.
1) 순서가 잘못된 두 개의 숫자를 찾을 때마다 0으로 돌아가 비교를 다시 실행하십시오. 그러나 24와 25 값을 바꾸면 24 이전의 값이 정확하다는 것을 이미 알고 있으므로 돌아가서 23과 24 값을 비교하기 만하면됩니다.
2) 값을 0으로 설정했지만 for 루프는 "I"를 1 씩 증가시켜 인덱스 1에서만 비교를 시작하므로 첫 번째 값은 항상 순서가 맞지 않습니다 (무작위로 가장 작은 값이되지 않는 한 ).
다음을 사용하여 두 문제를 모두 해결할 수 있습니다.
i = Math.max(-1, i - 2);
노트 :
이 클래스는 paintChildren () 메소드의 페인팅 코드로 작동하지만 코드는 MadProgrammer가 제안한대로 paintComponent () 메소드로 이동해야합니다. 사용자 정의 페인팅은 paintComponent () 메소드에서 수행해야합니다. paintChildren () 메서드는 Swing에서 패널에 추가 된 Swing 구성 요소를 그리는 데 사용됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다