民族建设集团有限公司官方网站西部数码的vps云主机如何访问网站
民族建设集团有限公司官方网站,西部数码的vps云主机如何访问网站,坑梓网站建设市场,云南软件开发公司排名1、演示视频 基于Java Swing的排序算法可视化器2、项目截图 设计说明
3.1 整体架构设计
本项目采用MVC#xff08;模型-视图-控制器#xff09;的设计思想进行架构划分#xff0c;将数据处理、界面展示和用户交互分离#xff0c;提高代码的可维护性和扩展性#xff1a; …1、演示视频基于Java Swing的排序算法可视化器2、项目截图设计说明3.1 整体架构设计本项目采用MVC模型-视图-控制器的设计思想进行架构划分将数据处理、界面展示和用户交互分离提高代码的可维护性和扩展性模型Model包括数组数据、排序算法逻辑、排序状态控制如isSorting、isPaused负责数据的存储和处理。视图View基于Java Swing的GUI组件包括窗口、控制面板、绘图面板SortingPanel负责界面的展示和渲染。控制器Controller包括按钮的事件监听器、排序线程的管理负责处理用户的交互操作并协调模型和视图的交互。3.2 关键技术点设计3.2.1 多线程设计为了避免排序算法的执行阻塞UI线程导致界面卡死项目使用独立的线程执行排序逻辑点击“开始排序”后创建新的Thread线程执行排序算法。使用AtomicBoolean类型的变量isSorting、isPaused控制排序状态保证跨线程的状态可见性和原子性。使用Object对象作为暂停锁pauseLock通过wait()和notify()方法实现线程的暂停和唤醒。3.2.2 GUI渲染设计自定义绘图面板SortingPanel继承自JPanel重写paintComponent()方法实现柱状图的绘制根据数组长度计算每个柱状图的宽度和间距保证布局的美观性。根据当前操作的索引currentIndex和比较的索引compareIndex设置不同的颜色实现高亮标记。使用SwingUtilities.invokeLater()方法确保UI更新操作在事件调度线程EDT中执行避免线程安全问题。3.2.3 状态管理设计使用AtomicBoolean替代普通的volatile布尔变量保证状态修改的原子性isSorting标记是否正在排序控制开始按钮的启用/禁用。isPaused标记是否暂停排序控制暂停/继续按钮的启用/禁用。isNormalComplete使用AtomicBoolean包装标记是否正常完成排序避免Lambda表达式引用局部变量的编译错误。四、算法说明本项目支持7种常见的排序算法以下是各算法的核心原理、时间复杂度和特点说明排序算法核心原理平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序相邻元素两两比较将较大的元素逐步“冒泡”到数组末尾O(n²)O(n)O(n²)O(1)稳定选择排序每次选择未排序部分的最小元素放到已排序部分的末尾O(n²)O(n²)O(n²)O(1)不稳定插入排序将当前元素插入到已排序部分的合适位置类似整理扑克牌O(n²)O(n)O(n²)O(1)稳定快速排序选择基准元素将数组分为小于基准和大于基准的两部分递归排序O(n log n)O(n log n)O(n²)O(log n)不稳定归并排序将数组分成两部分递归排序然后合并两个有序的子数组O(n log n)O(n log n)O(n log n)O(n)稳定希尔排序插入排序的改进版按步长分组进行插入排序逐步减小步长O(n log n)O(n log² n)O(n log² n)O(1)不稳定堆排序构建大顶堆将堆顶元素与末尾元素交换重新堆化重复操作O(n log n)O(n log n)O(n log n)O(1)不稳定4.1 算法实现共性所有排序算法的实现都加入了以下共性逻辑以支持可视化和交互功能在关键步骤调用checkPause()方法检查是否需要暂停排序。设置currentIndex和compareIndex标记当前操作和比较的元素用于界面高亮。调用SwingUtilities.invokeLater()刷新绘图面板展示最新的排序状态。添加Thread.sleep()方法控制排序速度让用户能够清晰看到每一步的过程。五、测试说明5.1 测试环境操作系统Windows 10/11、macOS、Linux兼容所有支持Java的系统JDK版本JDK 8及以上开发工具IntelliJ IDEA、Eclipse可选5.2 测试用例测试用例编号测试内容测试步骤预期结果TC001随机数组生成1. 启动程序2. 点击“生成随机数组”按钮界面展示新的随机柱状图无报错TC002排序算法执行1. 选择“冒泡排序”2. 点击“开始排序”柱状图动态排序最终有序弹出耗时提示TC003暂停功能1. 开始排序2. 点击“暂停”按钮排序停止弹出暂停提示暂停按钮禁用继续按钮启用TC004继续功能1. 暂停排序2. 点击“继续”按钮排序恢复执行继续按钮禁用暂停按钮启用TC005重置功能排序中1. 开始排序2. 点击“重置”按钮排序中断数组重置为随机状态无排序完成提示TC006重置功能排序完成1. 排序完成2. 点击“重置”按钮数组重置为随机状态按钮恢复初始状态TC007算法切换测试1. 选择“快速排序”2. 开始排序3. 完成后选择“堆排序”4. 开始排序不同算法均能正常执行展示对应的排序过程5.3 测试注意事项测试时需确保JDK版本为8及以上避免语法兼容问题。排序过程中频繁点击暂停/继续/重置按钮测试线程安全和状态管理的稳定性。测试不同的数组长度修改arraySize变量确保绘图面板的适配性。六、关键代码6.1 自定义绘图面板SortingPanel负责柱状图的绘制和颜色高亮标记是可视化的核心组件private class SortingPanel extends JPanel { Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (array null) { return; } int barWidth PANEL_WIDTH / arraySize; int gap 2; int drawableWidth barWidth - gap; for (int i 0; i arraySize; i) { int barHeight array[i]; int x i * barWidth gap / 2; int y PANEL_HEIGHT - barHeight; // 设置柱形颜色 setBarColor(g, i); // 绘制柱形 g.fillRect(x, y, drawableWidth, barHeight); g.setColor(Color.BLACK); g.drawRect(x, y, drawableWidth, barHeight); } } /** * 设置柱形颜色 */ private void setBarColor(Graphics g, int index) { if (index currentIndex) { g.setColor(Color.RED); // 操作中元素标红 } else if (index compareIndex) { g.setColor(Color.ORANGE); // 比较中元素标橙 } else { g.setColor(Color.BLUE); // 普通元素标蓝 } } }6.2 暂停检查方法checkPause实现排序线程的暂停和唤醒是交互功能的核心逻辑/** * 暂停检查在排序步骤中调用若暂停则等待被唤醒 * throws InterruptedException 线程中断异常 */ private void checkPause() throws InterruptedException { synchronized (pauseLock) { while (isPaused.get() !Thread.currentThread().isInterrupted()) { pauseLock.wait(); // 暂停线程直到被notify } } // 若线程被中断抛出异常终止排序 if (Thread.currentThread().isInterrupted()) { throw new InterruptedException(排序被重置中断); } }6.3 开始排序的事件监听器StartSortListener处理开始排序的用户操作管理排序线程的创建和执行private class StartSortListener implements ActionListener { Override public void actionPerformed(ActionEvent e) { if (isSorting.get()) { JOptionPane.showMessageDialog(null, 正在排序中请等待, 提示, JOptionPane.INFORMATION_MESSAGE); return; } // 修复将变量声明为final确保Lambda可以引用 final String selectedAlgorithm (String) algorithmComboBox.getSelectedItem(); // 修复使用AtomicBoolean包装isNormalComplete使其引用为final值可修改 final AtomicBoolean isNormalComplete new AtomicBoolean(true); // 开启新线程执行排序 sortingThread new Thread(() - { // 设置排序状态为true isSorting.set(true); isPaused.set(false); // 强制在UI线程更新按钮状态关键排序线程启动后立即刷新 SwingUtilities.invokeLater(() - { updateButtonStates(); sortingPanel.repaint(); }); long startTime System.currentTimeMillis(); try { // 执行选中的排序算法 switch (selectedAlgorithm) { case 冒泡排序: bubbleSort(); break; case 选择排序: selectionSort(); break; case 插入排序: insertionSort(); break; case 快速排序: quickSort(0, arraySize - 1); break; case 归并排序: mergeSort(); break; case 希尔排序: shellSort(); break; case 堆排序: heapSort(); break; default: JOptionPane.showMessageDialog(null, 暂不支持该算法, 错误, JOptionPane.ERROR_MESSAGE); isNormalComplete.set(false); // 非算法执行标记为非正常完成 break; } } catch (InterruptedException ex) { // 捕获中断异常重置时触发标记为非正常完成 isNormalComplete.set(false); Thread.currentThread().interrupt(); // 保留中断状态 System.out.println(排序被重置中断 ex.getMessage()); } // 排序完成/中断后的处理重置状态 isSorting.set(false); isPaused.set(false); sortingThread null; resetHighlightIndex(); // 更新GUI强制在UI线程执行 SwingUtilities.invokeLater(() - { // 仅当正常完成时才显示排序完成提示核心修复用AtomicBoolean的get方法判断 if (isNormalComplete.get()) { long endTime System.currentTimeMillis(); JOptionPane.showMessageDialog(null, selectedAlgorithm 完成\n耗时 (endTime - startTime) ms, 排序完成, JOptionPane.INFORMATION_MESSAGE); } sortingPanel.repaint(); updateButtonStates(); }); }); // 启动线程 sortingThread.start(); } }6.4 冒泡排序实现含可视化和暂停逻辑所有排序算法的实现模板包含暂停检查、高亮标记和界面刷新/** * 冒泡排序添加暂停检查 */ private void bubbleSort() throws InterruptedException { int n array.length; for (int i 0; i n - 1; i) { for (int j 0; j n - i - 1; j) { checkPause(); currentIndex j; compareIndex j 1; SwingUtilities.invokeLater(() - sortingPanel.repaint()); Thread.sleep(30); if (array[j] array[j 1]) { swap(j, j 1); SwingUtilities.invokeLater(() - sortingPanel.repaint()); Thread.sleep(30); } } } }