通过 java swing 进行快速排序可视化



我想制作某种排序算法可视化是java swing,但我被困在快速排序上,因为我需要每次迭代都停止分区循环,以便数组可以重新绘制。这就是我想做的方式,但没有任何成功

public int partition(int lowIndex, int highIndex,int i)
{
int pivot = highIndex;
for(int j=lowIndex; j<highIndex; j++)
{
if(isBigger(j,pivot))
{
i++;
swap(i,j);
return i;
}
}
swap(i+1,pivot);
return i+1;
}

也没有找到任何好的解决方案来跟踪我。我只是一无所知

谷歌的"Java swing可视化排序算法",你会发现很多点击。

例如:

代码审查:排序算法可视化程序

要点:

  • 您需要修改"排序"代码以在每个步骤中触发某种"事件"(例如,每次交换元素时(:

    例:

    public class BubbleSort implements SortingAlgorithm {
    ...
    @Override
    public void doSort(int[] nums) {
    ...
    SortingAlgorithm.setCurrentBar(j+1);
    SortingAlgorithm.sleepFor(delay);
    
  • "事件处理程序"将重绘数组(或者更准确地说,请求事件调度程序线程 (EDT( 重绘(。

  • 因此,事件处理程序需要"知道"数组和当前索引

    例:

    public abstract interface SortingAlgorithm {
    ...
    public abstract void doSort(int[] nums);
    public abstract void changeDelay(int delay);
    public static void setCurrentBar(int currentBarIndex) {
    PaintSurface.currentBarIndex = currentBarIndex;
    }
    ...
    
  • 每个步骤之间还需要有某种"延迟">

  • 此示例使用 SwingUtilities.invokeLater((。 这个例子camickr建议SwingWorker。

我希望这能给你一些想法,并为你指明正确的方向!

我没有从其他类调用分区,而是在一个匿名的 SwingWorker 类中实现了 partition(( 和 sort(( 方法,并且在 partition(( 方法的每次交换之后,我调用了 publish(array(。如果有人想看看我是如何解决这个问题或自己需要帮助,请上传源代码。任何反馈都非常感谢,因为这是我的第一个"更大"项目

private  void startThread()
{
SwingWorker sw1 = new SwingWorker()  {
public int partition(int lowIndex, int highIndex) {
int pivot = highIndex;
int i = lowIndex - 1;
for (int j = lowIndex; j < highIndex; j++) {
if (sorter.isBigger(pivot, j)) {
i++;
sorter.swap(i, j);
try {
Thread.sleep(100);
}
catch(Exception e)
{
// not implemented yet
}
publish(sorter.getArray());
}
}
sorter.swap(i+1,pivot);
publish(sorter.getArray());
return i+1;
}
public void sort(int lowIndex, int highIndex)
{
if(lowIndex < highIndex)
{
int i = partition(lowIndex,highIndex);
try{
sort(lowIndex,i-1) ;
}
finally {
sort(i+1, highIndex);
}
}
}
@Override
protected int[] doInBackground() throws Exception {
sorter.setArray(drafter.getArray());
while (!sorter.isArraySorted()) {
//Thread.sleep(10);
sort(0,sorter.getLength()-1);
}

return sorter.getArray();
}
protected void process(List chunks)
{
int[] val = (int[]) chunks.get(chunks.size()-1);
drafter.ChangeArray(val);
//drafter.repaint();
}
};
sw1.execute();
}

最新更新