我想制作某种排序算法可视化是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();
}