java - 实现合并排序
问题描述
我已经实现了一个 MergeSorting,它采用一个 Generic Data 类型和一个上下索引边界,在它通过这些边界后停止排序。例如 {85,31,321,6549,123,2,1,0} lower = 0 upper = 4 将产生 [31,85,123,321,6549,2,1,0]。虽然当我测试我的代码时,它给出了一个 stackoverflow 错误,我不知道为什么。
我查看了我的代码,但找不到问题,也许我没有突破递归调用的边缘情况。
import java.util.ArrayList;
public class Sorts<T extends Comparable<? super T>> {
public void merge(ArrayList<T> list, int start, int mid, int end)
{
ArrayList<T> tempArr = new ArrayList<T>(end - start);
int leftidx = start;
int rightidx = mid;
while(true)
{
if (leftidx == mid)
{
tempArr.addAll(list.subList(rightidx,end));
break;
}
else if (rightidx == end)
{
tempArr.addAll(list.subList(leftidx, mid));
break;
}
T left = list.get(leftidx);
T right = list.get(rightidx);
int check = left.compareTo(right);
if (check < 0)
{
tempArr.add(left);
leftidx++;
}
else
{
tempArr.add(right);
rightidx++;
}
}
for (int j = 0; j < tempArr.size(); j++)
{
list.set(start + j, tempArr.get(j));
}
}
public void MergeSort(ArrayList<T> list, int start, int end) {
int median = start + (end - start) / 2;
MergeSort(list, start, median);
MergeSort(list, median, end);
merge(list, start, median, end);
}
}
当我运行测试时,它在第 82 行给出错误“java.lang.StackOverflowError”,这是我的合并排序类中的 MergeSort(list,start,median)。我的测试员课程是:
public class SortsTester extends Sorts{
public void mergeSortTester{
Integer [] arr = {85,31,321,6549,123,2,1,0};
ArrayList<Integer> ranArrLst = new ArrayList<>(Arrays.asList(arr));
MergeSort(ranArrLst,0,7);
System.out.println(Arrays.toString(ranArrLst.toArray()));
}
}
解决方案
当元素少于两个时,您不应在 MergeSort 中执行任何操作:
public void MergeSort(ArrayList<T> list, int start, int end) {
if ((end - start) < 2) {
return;
}
int median = start + ((end - start) / 2);
MergeSort(list, start, median);
MergeSort(list, median, end);
merge(list, start, median, end);
}
推荐阅读
- angular - 角度表单更新表单值将父页面设置为多个子页面
- python - 从列表中返回子列表,其中最后一个元素链接回列表的起始索引
- ocaml - bs.as 和 unicode 字符串
- excel - 多个 Sumif 在 DAX 中表现出色
- html - 是否可以锁定某些单词以使其无法移动
- spring - 如何使用 Spring Boot 安全性设置手动身份验证用户
- javascript - 提示框出现 10 秒后如何刷新?
- c# - Newtonsoft JsonConvert.DefaultSettings 奇怪的行为
- docker - 无法访问我主机上服务上的已发布端口
- assembly - 如何比较输入并检查数字是负数、正数还是零