java - 通用可比较合并排序算法的 Stackoverflow 错误

标签 java algorithm sorting stack-overflow mergesort

我在排序方法中的合并排序调用中不断收到 stackoverflow 错误。它可能是一个快速修复,但我现在想不出任何东西。请查看我的代码。

public class MergeSorter {

    public static <T> void sort(Comparable<? extends T>[] items) {
        if (items == null) {
            throw new IllegalArgumentException("Item is null.");
        }
        mergeSort(items, 0, items.length - 1);
    }

    @SuppressWarnings("unchecked")
    private static <T> void mergeSort(Comparable<? extends T>[] items, int begIndx, int endIndx) {
        if(begIndx == endIndx) {
            return;
        }
        if(items.length > 1) {
            int midIndx = items.length / 2;
            mergeSort(items, begIndx, midIndx);
            mergeSort(items, midIndx + 1, endIndx);
            merge(items, begIndx, midIndx, endIndx);
        }
    }

    @SuppressWarnings("unchecked")
    private static <T> void merge(Comparable<? extends T>[] array, int begIndx, int midIndx, int endIndx) {
        int sizeOfLeft = midIndx - begIndx + 1;
        int sizeOfRight = endIndx - midIndx;

        /// change to generic later
        @SuppressWarnings("unchecked")
        T[] leftArr = (T[]) new Object[sizeOfLeft + 1];
        @SuppressWarnings("unchecked")
        T[] rightArr = (T[]) new Object[sizeOfRight + 1];

        for (int i = 0; i <= sizeOfLeft; i++) {
            leftArr[i] = (T) array[begIndx + i];
        }
        for (int j = 0; j <= sizeOfRight; j++) {
            rightArr[j] = (T) array[midIndx + j + 1];
        }
        int i = 0;
        int j = 0;
        for (int k = begIndx; k <= endIndx; k++) {
            if (i == sizeOfLeft) {
                array[k] = (Comparable<? extends T>) rightArr[j++];
            } else if(j == sizeOfRight) {
                array[k] = (Comparable<? extends T>) leftArr[i++];
            } else if(((Integer) leftArr[i]).compareTo((Integer)rightArr[j]) <= 0) {
                array[k] = (Comparable<? extends T>) leftArr[i++];
            } else {
                array[k]=(Comparable<? extends T>) rightArr[j++];
            }
        }
    }

}

如果我给它一个包含 5 个元素的整数数组
5, 24, 79, 8, 3;

那我应该拿回 3,5,8,24,79。

最佳答案

您的问题是您总是将中间索引基于 items.length,每次调用都是相同的。

对于该调用,中间索引应该在 begIndx 和 endIndx 之间的中间位置,这很重要。

关于java - 通用可比较合并排序算法的 Stackoverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56309542/

相关文章:

java - 如何在 eclipse 4.2 中贡献一个新 View ?

java - 重新排列项目而不改变所有项目的排名

algorithm - STL和.net基础库默认搜索用的是哪种排序算法?

php - Sql/php 中的多词搜索

algorithm - shell脚本排序列表

java - org.json.JSONObject 可以生成 {"und":[ {"value" :"some@one.com"}]}?

java - 突然无法在 Intellij 中打开任何 java 程序

java - HQL 使用两列中的最大值对记录进行排序

regex - 如何从给定的字符串列表自动生成正则表达式?

java - 我执行 "Intersection of Two Linked Lists"的错误在哪里?