7.3 排序算法的可视化

排序算法可视化是理解算法工作原理的有效工具。通过可视化,我们可以直观地看到不同算法在不同数据分布下的表现。

java
复制代码
import javax.swing.*;
import java.awt.*;
import java.util.Random;

public class SortingVisualizer extends JPanel {
    
    private int[] arr;
    private static final int BAR_WIDTH = 3;
    private static final int DELAY = 1;
    
    public SortingVisualizer(int size) {
        arr = new int[size];
        Random random = new Random();
        for (int i = 0; i < size; i++) {
            arr[i] = random.nextInt(getHeight());
        }
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < arr.length; i++) {
            int height = arr[i];
            g.fillRect(i * BAR_WIDTH, getHeight() - height, BAR_WIDTH - 1, height);
        }
    }
    
    public void bubbleSortVisualized() {
        new Thread(() -> {
            int n = arr.length;
            for (int i = 0; i < n - 1; i++) {
                for (int j = 0; j < n - 1 - i; j++) {
                    if (arr[j] > arr[j + 1]) {
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                        repaint();
                        try {
                            Thread.sleep(DELAY);
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                    }
                }
            }
        }).start();
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("排序算法可视化");
        SortingVisualizer visualizer = new SortingVisualizer(200);
        frame.add(visualizer);
        frame.setSize(600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        
        visualizer.bubbleSortVisualized();
    }
}