java - 我怎样才能使这个插入排序方法一次运行一个步骤?

标签 java sorting insertion-sort

我正在尝试以可视方式为该方法添加动画效果,并且我想使用计时器来控制插入排序,方法是让它每隔一段时间(100 毫秒)检查一个索引或交换一组索引。通过这种方式,我可以逐步了解它。

方法如下:

public static void sort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        int j = i;
        while(j > 0 && arr[j] < arr[j-1]){
            ArrayUtility.swap(j,j-1, arr);
            j--;
        }
    }
}

这样做的目的是,如果一对索引相互检查,该方法不会继续循环,它检查索引然后停止,直到允许该方法的下一部分运行 100 毫秒之后。

最佳答案

解释

记住当前的 ij 索引,然后您可以随时通过提取所有可能的单个步骤轻松地暂停和恢复你的循环结构,即:

  • 常规内循环迭代
  • 内循环结束,推进外循环
  • 外层循环结束,算法完成

我会创建一个 Sorter 类,其中包含这些索引和数组作为字段,然后您可以提供一个简单的 sortStep 方法,它只执行一个步骤并更新索引.


解决方案

public class Sorter {
    private final int[] values;
    private int i = 1;
    private int j = 1;

    public Sorter(int[] values) {
        this.values = values;
    }

    public int[] getValues() {
        return values;
    }

    // @returns Whether sorting algorithm has finished
    public boolean sortStep() {
        if (i >= values.length) {
            // Outer loop has finished
            return true;
        }

        if (j > 0 && values[j] < values[j - 1]) {
            // Inner loop iteration
            ArrayUtility.swap(j, j - 1, values);
            j--;
        } else {
            // Inner loop has finished, outer loop iteration
            i++;
            j = i;
        }
        return false;
    }
}

现在您可以简单地在循环中调用 sortStep 直到它完成:

int[] values = ...
Sorter sorter = new Sorter(values);

while (!sorter.sortStep()) {
    // Animate
    displayValues(values);
    Thread.sleep(100);
}

或者将该方法连接到 UI 上一些不错的暂停和恢复按钮。


注意事项

如果你不想治疗

  • 常规内循环迭代
  • 内循环结束,推进外循环

作为两个独立的步骤,但作为一个步骤,您可以简单地将 case 移出 if-else 构造并在内部迭代后直接执行:

if (j > 0 && values[j] < values[j - 1]) {
    // Inner loop iteration
    ArrayUtility.swap(j, j - 1, avaluesrr);
    j--;
}

if (j <= 0 || values[j] >= values[j - 1]) {
    // Inner loop has finished, outer loop iteration
    i++;
    j = i;
}

同样,您可以将 done 检测放在方法的末尾,让方法在真正完成时输出 true。这样,您就不必再次调用它而没有任何效果:

// Duplicated at the end of sortStep
if (i >= values.length) {
    // Outer loop has finished
    return true;
}

关于java - 我怎样才能使这个插入排序方法一次运行一个步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953508/

相关文章:

java - 泛型方法,泛型类型未知

java - Eclipse Java EE IDE 不支持 javax.servlet 包

java - Java中使用二分查找实现二分插入排序

java - 如何防止命令行 java 进程在 OSX 中窃取焦点?

java - 将 Azure 媒体服务缩略图任务预设与 Java SDK 结合使用

php - 如何对 UTF-8 字符串数组进行排序?

python - 将具有连续 block 项目但不连续 block 的列表拆分为子列表

java - "Đ"使用 Java 对越南语文本进行排序时排序不正确

java - 堆排序与插入排序 JMH 基准测试 : why my insertion impl. 花费的时间更少?

c++ - 插入排序算法,我的代码有什么问题?