首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现MergeSort

实现MergeSort
EN

Stack Overflow用户
提问于 2019-04-30 19:01:45
回答 1查看 32关注 0票数 1

我已经实现了一个MergeSorting,它接受一个泛型数据类型和一个上下索引界限,在超过这些界限后停止排序。示例{85,31,321,6549,123,2,1,0} lower =0 upper =4将生成31,85,123,321,6549,2,1,0。虽然当我测试我的代码时,它给出了一个堆栈溢出错误,我不知道为什么。

我已经检查了我的代码,但找不到问题,也许我没有一个边缘情况来打破递归调用。

代码语言:javascript
复制
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);

   }
}

当我运行一个测试时,在我mergesort类中的MergeSort(list,start,median)第82行给出了一个错误"java.lang.StackOverflowError“。我的测试类是:

代码语言:javascript
复制
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()));
     }
}
EN

回答 1

Stack Overflow用户

发布于 2019-04-30 19:19:25

当元素少于两个时,您不应在MergeSort中执行任何操作:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55919531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档