Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren

CptK

Bekanntes Mitglied
Hallo, ich will für die Schule den Merge-Sort-Algorithmus in Java visualisieren. Dafür habe ich folgenden Code:
Java:
private int[] data = {10,20,30,40,90,120,100,140,70,50,80,110};
    
     public int[] sort(int l, int r) {
            
        if (l < r) {
            int q = (l + r) / 2;
            sort(l, q);
            sort(q + 1, r);
            merge(l, q, r);
        }
        panel.setData(data);
        return data;
    }

    private void merge(int l, int q, int r) {
        int[] arr = new int[data.length];
        int i, j;
        for (i = l; i <= q; i++) {
            arr[i] = data[i];
        }
        for (j = q + 1; j <= r; j++) {
            arr[r + q + 1 - j] = data[j];
        }
        i = l;
        j = r;
        for (int k = l; k <= r; k++) {
            if (arr[i] <= arr[j]) {
                data[k] = arr[i];
                i++;
            } else {
                data[k] = arr[j];
                j--;
            }
        }
    }

Das funktioniert auch einwandfrei, allerdings ist es für eine Visualisierung zu schnell. Ich nutze Balken für die Darstellung die am Ende der Länge nach sortiert sein sollen. Auch das geht, allerdings so schnell, dass man nur das Endergebnis sieht und nicht die einzelnen Veränderungen, Wie würde ich das so ändern, dass das System nach jedem Schritt so lange pausiert, so dass man die Veränderungen sehen kann?
 
Java:
import java.awt.BorderLayout;
import java.util.*;
import javax.swing.*;

public class MergeSort {

    class SorterThread extends Thread {

        public void run() {
            int[] sorted = sort(0, data.length-1);

            SwingUtilities.invokeLater(() -> update(-1,-1));
        }

        public int[] sort(int l, int r) {
            
            if (l < r) {
                int q = (l + r) / 2;
                sort(l, q);
                sort(q+1, r);
                merge(l, q, r);
                synchronized(data) {
                    try {
                        SwingUtilities.invokeLater(() ->update(l, r));
                        data.wait();
                    } catch (InterruptedException ex) {}
                }
            }
            return data;
        }

        private void merge(int l, int q, int r) {
            int[] arr = new int[data.length];
            int i, j;
            for (i = l; i <= q; i++) {
                arr[i] = data[i];
            }
            for (j = q + 1; j <= r; j++) {
                arr[r + q + 1 - j] = data[j];
            }
            i = l;
            j = r;
            for (int k = l; k <= r; k++) {
                if (arr[i] <= arr[j]) {
                    data[k] = arr[i];
                    i++;
                } else {
                    data[k] = arr[j];
                    j--;
                }
            }
        }
    }

    private int[] data = {100,80,50,40,90,120,140,30,20,60,10};
    
    private JLabel label = new JLabel();
    private JButton step = new JButton("Weiter");

    private void update(int left, int right) {
        synchronized(data) {
            StringBuilder b = new StringBuilder(Arrays.toString(data));
            if (left != -1 && right != -1) {
                b.append(" [" + left + ", " + right + "]");
                step.setEnabled(true);
            } else {
                b.append(" - FERTIG");
            }
            label.setText(b.toString());
        }
    }


    public void run() {
        step.addActionListener(e -> {
            synchronized(data) {
                step.setEnabled(false);
                data.notify();
            }
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(label);
        frame.add(step, BorderLayout.SOUTH); 
        frame.setSize(600, 200);
        frame.setVisible(true);

        new SorterThread().start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new MergeSort().run());
    }
}
 

Zurück
Oben