【问题标题】:Array Sort method数组排序方法
【发布时间】:2012-04-21 10:34:01
【问题描述】:

在过去的几天里,我一直在努力实现一种字典式合并排序方法。如果我得到了一个点:ArrayIndexOutOfBounds 错误,我不知道为什么。如果有人可以看一下并告诉我可能出了什么问题。我尝试调试,但所有值似乎都是正确的。

回复aix:就在此时temp[index1] = array[min + index1] ; 这些是那个确切时间的值:

array :String[5] (5 entries originating from a text file)
min : 0
max : 1
size : 2
pivot : 0
temp : Comparable<T>[2]  (both entries null)

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at Merge.mergeSort(Merge.java:47)
    at Merge.mergeSort(Merge.java:43)
    at Merge.Sort(Merge.java:20)
    at Sort.main(Sort.java:96)

第 43 行:

mergeSort(array, pivot + 1, max) ;

第 47 行:

temp[index1] = array[min + index1] ;

代码:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Merge 
{
    public static void Sort (LinkedList listIn, int size) throws Exception
    {
        String[] mArray = new String[size] ;
        String textContent = null ;
        File outputFile ;

        //copy the list values in the array
        for (int i = 0 ; i < size ; i++)
        {
             mArray [i] = listIn.get(i).printNode();
        }

        mergeSort(mArray, 0, mArray.length) ;       


    }

    public static <T extends Comparable<? super T>> void mergeSort(T[] array, int min, int max)
    {
        T[] temp ;
        int index1 ;
        int left ;
        int right ;

        // if array is of size 1

        if (min == max)
            return ;

        // find length and midpoint
        int size = max - min + 1 ;
        int pivot = (min + max) / 2 ;
        temp = (T[]) (new Comparable[size]) ;

        mergeSort(array, min, pivot) ;
        mergeSort(array, pivot + 1, max) ;

        for (index1 = 0 ; index1 < size ; index1++)
        {
            temp[index1] = array[min + index1] ;
        }

        left = 0 ;
        right = pivot - min + 1 ;
        for (index1 = 0 ; index1 < size ; index1++)
        {
            if (right <= max - min)
                if (left <= pivot - min)
                    if (temp[left].compareTo(temp[right]) > 0)
                        array[index1 + min] = temp[right++] ;
                    else
                        array[index1 + min] = temp[left++] ;
                else
                    array[index1 + min] = temp[right++] ;
            else
                array[index1 + min] = temp[left++] ;
        }
    }


}

【问题讨论】:

  • 如果您在异常点包含堆栈跟踪,它会帮助其他人帮助您。
  • 看看编辑过的问题。我一会儿就会有踪迹
  • 请包括堆栈跟踪或其中指出异常的部分..
  • SO 不应该是众包调试器。
  • 只是提一下 - 这是快速排序,而不是合并排序

标签: java arrays sorting merge


【解决方案1】:

当您第一次调用 merge 时,您的 Sort 方法发送了错误的值。将mergeSort(mArray, 0, mArray.length) 更改为mergeSort(mArray, 0, mArray.length-1);

【讨论】: