이 정렬 시각화가 왜 그렇게 느린가요?

사샤에로

어제 정렬 알고리즘 비교에 대한 멋진 비디오를 보았습니다. 나는 똑같이 쓰기로 결정했지만 시작 직후이 정렬 시각화가 엄청나게 느리다는 것을 알았습니다. 이 코드로

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
정렬이 가장 느리다는 것을 알고 있지만 (무작위 정렬 제외) 그렇지 않습니다!

Camickr
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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

핑이 왜 그렇게 느린가요?

분류에서Dev

Firefox 위치 표시 줄이 왜 그렇게 느린가요?

분류에서Dev

내 localhost HTTP 응답 시간이 왜 그렇게 느린가요?

분류에서Dev

이 xamarin 페이지가 왜 그렇게 느린가요?

분류에서Dev

이 Oracle 쿼리가 왜 그렇게 느린가요?

분류에서Dev

이 SQL 쿼리가 왜 그렇게 느린가요?

분류에서Dev

이 Joomla 쿼리가 왜 그렇게 느린가요?

분류에서Dev

이 기간 쿼리가 왜 그렇게 느린가요?

분류에서Dev

이 Jquery / JavasScript가 왜 그렇게 느린가요?

분류에서Dev

내 무선이 왜 그렇게 느린가요?

분류에서Dev

내 LAN 연결이 왜 그렇게 느린가요?

분류에서Dev

len (s) 호출이 왜 그렇게 느린가요?

분류에서Dev

업그레이드 가져 오기 속도가 왜 그렇게 느린가요?

분류에서Dev

Fermat 소수성 검정에 대한 알고리즘이 왜 그렇게 느린가요?

분류에서Dev

RAM이 너무 많은데 시스템이 왜 그렇게 느린가요?

분류에서Dev

이 Monte Carlo Haskell 프로그램이 왜 그렇게 느린가요?

분류에서Dev

이 Monte Carlo Haskell 프로그램이 왜 그렇게 느린가요?

분류에서Dev

이 프라임 감지 프로그램이 왜 그렇게 느린가요?

분류에서Dev

bs가 100M이고 dd가 왜 그렇게 느린가요?

분류에서Dev

내 테이프 드라이브가 왜 그렇게 느린가요?

분류에서Dev

reCAPTCHA 이미지 페이드 인 / 아웃이 왜 그렇게 느린가요?

분류에서Dev

이 간단한 단어 매크로가 왜 그렇게 느린가요?

분류에서Dev

NetworkX의 Girvan-Newman 알고리즘이 왜 그렇게 느린가요?

분류에서Dev

WMV를 MP4로 변환하는 것이 왜 그렇게 느린가요?

분류에서Dev

dd를 사용할 때 내 / dev / random이 왜 그렇게 느린가요?

분류에서Dev

내 공간 해시가 왜 그렇게 느린가요?

분류에서Dev

프린터 "Windows Update"-왜 항상 그렇게 느린가요?

분류에서Dev

프린터 "Windows Update"-왜 항상 그렇게 느린가요?

분류에서Dev

pystan 설치가 왜 그렇게 느린가요?

Related 관련 기사

  1. 1

    핑이 왜 그렇게 느린가요?

  2. 2

    Firefox 위치 표시 줄이 왜 그렇게 느린가요?

  3. 3

    내 localhost HTTP 응답 시간이 왜 그렇게 느린가요?

  4. 4

    이 xamarin 페이지가 왜 그렇게 느린가요?

  5. 5

    이 Oracle 쿼리가 왜 그렇게 느린가요?

  6. 6

    이 SQL 쿼리가 왜 그렇게 느린가요?

  7. 7

    이 Joomla 쿼리가 왜 그렇게 느린가요?

  8. 8

    이 기간 쿼리가 왜 그렇게 느린가요?

  9. 9

    이 Jquery / JavasScript가 왜 그렇게 느린가요?

  10. 10

    내 무선이 왜 그렇게 느린가요?

  11. 11

    내 LAN 연결이 왜 그렇게 느린가요?

  12. 12

    len (s) 호출이 왜 그렇게 느린가요?

  13. 13

    업그레이드 가져 오기 속도가 왜 그렇게 느린가요?

  14. 14

    Fermat 소수성 검정에 대한 알고리즘이 왜 그렇게 느린가요?

  15. 15

    RAM이 너무 많은데 시스템이 왜 그렇게 느린가요?

  16. 16

    이 Monte Carlo Haskell 프로그램이 왜 그렇게 느린가요?

  17. 17

    이 Monte Carlo Haskell 프로그램이 왜 그렇게 느린가요?

  18. 18

    이 프라임 감지 프로그램이 왜 그렇게 느린가요?

  19. 19

    bs가 100M이고 dd가 왜 그렇게 느린가요?

  20. 20

    내 테이프 드라이브가 왜 그렇게 느린가요?

  21. 21

    reCAPTCHA 이미지 페이드 인 / 아웃이 왜 그렇게 느린가요?

  22. 22

    이 간단한 단어 매크로가 왜 그렇게 느린가요?

  23. 23

    NetworkX의 Girvan-Newman 알고리즘이 왜 그렇게 느린가요?

  24. 24

    WMV를 MP4로 변환하는 것이 왜 그렇게 느린가요?

  25. 25

    dd를 사용할 때 내 / dev / random이 왜 그렇게 느린가요?

  26. 26

    내 공간 해시가 왜 그렇게 느린가요?

  27. 27

    프린터 "Windows Update"-왜 항상 그렇게 느린가요?

  28. 28

    프린터 "Windows Update"-왜 항상 그렇게 느린가요?

  29. 29

    pystan 설치가 왜 그렇게 느린가요?

뜨겁다태그

보관