java - 此插入排序算法仅交换前 2 个元素并停止。我该如何解决?
问题描述
给定一个数组、一个开始索引和一个结束索引,按排序顺序输出数组。示例 {"c","b","d","a"} --> {"a","b","c","d"}
问题是算法只在第一个索引和它之前的索引之间执行所需的交换(如果满足交换条件)。
public void insertionSort(String[] array, int start, int how_many_elements) { // ndx start
for (int i = start + 1; (i < start + 1 + how_many_elements) && (i < data.length - 1); i++) { // assume in bounds
String key = data[i];
int j = fi;
while (j >= 0 && key.compareTo(data[j]) < 0) { // swap
String temp = data[j];
data[j] = key;
data[i] = temp;
j--; // continue down to first element
}
}
}
解决方案
j
应该是i - 1
每次,而不是开始索引。- 在循环中,只需将下一个元素的值设置为当前元素。(这必须在循环之后再做一次。)
public void insertionSort(String[] data, int fi, int how_many_elements) {
for (int i = fi + 1; (i < fi + 1 + how_many_elements) && (i < data.length); i++) {
String key = data[i];
int j = i - 1;
while (j >= 0 && key.compareTo(data[j]) < 0) {
data[j + 1] = data[j];
j--;
}
data[j + 1] = key;
}
}
推荐阅读
- visual-studio - 如何在 Visual Studio 中启用热插拔
- testing - 使用 Cucumberish 在 XCUITest 设置中重置应用程序
- python - 无法更改从 nodeJS 到 Python 的 spawn 发送的整数
- java - 在 ExtentReport 中打印屏幕截图
- c++ - 如何使用带有 Qt 和 C++ 的“接口类”来通信两个线程
- reactjs - 动态添加/删除输入 ReactJS
- sql - SQL 检索“日历”表
- c# - 异步并行循环返回任务之外太快,除非我在循环中检查完整的布尔值
- soap - 在 SSL 终止后,WSDL 绑定 URL 将协议更改为 HTTP
- c# - 单元测试,使用 Moq 验证异常消息