

package sort;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.Collections;
public class Exercise23_15 extends Application {
private static final int SIZE = 20; //数组大小
private ArrayList<Integer> list = new ArrayList<>(SIZE); //数组列表
private Rectangle[] rectangles = new Rectangle[SIZE]; //直方图
private Button step = new Button("Step"); //按钮
private Button reset = new Button("Reset");
private Text text = new Text(); //顶部文本
private int index, k; //索引(执行一次排序外循环)
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
HBox hBox = new HBox(10, step, reset); //顶部面板
hBox.setAlignment(Pos.CENTER);
BorderPane pane = new BorderPane(getCenter()); //总面板
pane.setTop(text);
pane.setBottom(hBox);
pane.setPadding(new Insets(2));
BorderPane.setAlignment(pane.getTop(), Pos.CENTER);
//按钮注册动作事件
step.setOnAction(event -> {
if (index < list.size() - 1) {
selectionSort();
pane.setCenter(getCenter());
rectangles[k].setStyle("-fx-fill: grey;");
} else
text.setText("The list has sorted");
});
reset.setOnAction(event -> {
Collections.shuffle(list);
pane.setCenter(getCenter());
text.setText("");
index = 0;
});
Scene scene = new Scene(pane, 500, 330);
primaryStage.setScene(scene);
primaryStage.setTitle("Exercise23_15");
primaryStage.show();
}
/** 返回中心面板 */
private HBox getCenter() {
if (list.size() == 0) { //数组列表空时,赋值
for (int i = 0; i < SIZE; i++)
list.add(i + 1);
Collections.shuffle(list);
}
//直方图
HBox hBox = new HBox();
hBox.setStyle("-fx-border-color: black; -fx-padding: 0 5px 5px;");
for (int i = 0; i < SIZE; i++) {
rectangles[i] = new Rectangle();
rectangles[i].setStyle("-fx-fill: white; -fx-stroke: grey;");
rectangles[i].setHeight(list.get(i) * 12);
rectangles[i].setWidth(23);
Label label = new Label(String.valueOf(list.get(i)), rectangles[i]);
label.setContentDisplay(ContentDisplay.BOTTOM);
label.setRotate(180);
hBox.getChildren().add(label);
}
hBox.setRotate(180);
return hBox;
}
/** 选择排序 */
public void selectionSort() {
if (index < list.size() - 1) {
int min = list.get(index);
int k = index;
for (int i = index + 1; i < list.size(); i++) {
if (list.get(i) > min) {
min = list.get(i);
k = i;
}
}
if (k != index) {
list.set(k, list.get(index));
list.set(index, min);
this.k = k;
}
index++;
}
}
}

使用JavaFX实现选择排序可视化
这个博客展示了如何用JavaFX创建一个交互式的选择排序可视化应用。程序包含了一个选择排序的实现,通过直方图展示排序过程,并提供Step和Reset按钮来控制排序的迭代和重置。用户可以观察到数组元素在每一步如何被比较和交换,从而理解选择排序的工作原理。
89

被折叠的 条评论
为什么被折叠?



