CountSort数组超出索引范围

时间:2014-10-30 06:19:20

标签: java arrays

我正在为我的大学课程实施CountSort。我制作了一个工作代码,适用于较小的数组(25个值),但是当我尝试运行这个具有多个数组大小的代码时,抛出了一个arrayoutofbounds异常,我不太清楚为什么。在我看来,数组大小应该没有任何问题,但任何关于正在发生的事情和如何解决它的输入将不胜感激! :)

import java.util.*;

public class CountSortMore
{
public static void main(String[] args)
{
    int SIZE = 0;
    int sizeList[] = {1000, 10000, 100000, 500000, 1000000};
    int[] nums = null;
    for (int sizeI = 0; sizeI < sizeList.length; sizeI++)
    {
        SIZE = sizeList[sizeI];
        nums = new int[SIZE];

        //random num generation up to 100000
        for (int i = 0; i < SIZE; i++)
        nums[i] = (int)(Math.random()*100000);

        //for (int i = 0; i < SIZE; i++)
        //{ 
        //  System.out.print(nums[i]);
        //  System.out.println("");
        //}

        //call CountSort
        final long startTime = System.currentTimeMillis();
            countSort(nums, 0, SIZE -1);
        final long endTime = System.currentTimeMillis();
            System.out.println("For n = " + SIZE + ", execution time = " + (endTime - startTime) );

        //verify sorting
        //for (int i = 0; i < SIZE; i++)
        //{
        //  System.out.print(nums[i]);
        //  System.out.println("");
        //}
    }
}

public static void countSort(int[] nums, int low, int high)
{
    int[] counts = new int[high - low +1];
    for (int x : nums)
        counts[x - low]++;
    int current = 0;
    for (int i = 0; i < counts.length; i++)
    {
        Arrays.fill(nums, current, current + counts[i], i + low);
        current += counts[i];
    }
}
}

2 个答案:

答案 0 :(得分:1)

我在这里可以看到一个问题:

for (int x : nums)
    counts[x - low]++;

您使用0-99999范围内的随机数索引count []数组,但您的最小数组只有1000长。

虽然我认为你的方法存在根本缺陷,但你可以通过将随机范围限制为SIZE来逃避爆炸(我没有仔细查看你的代码以确定它的意图)。


另外,考虑使用foreach循环。而不是:

int SIZE;
for (int sizeI = 0; sizeI < sizeList.length; sizeI++) {
    SIZE = sizeList[sizeI];

仅使用:

for (int SIZE : sizeList) {

您可能希望查看有关Java命名标准的章节。

答案 1 :(得分:0)

for (int x : nums) counts[x - low]++;

这是错的。从随后的代码中我想你想做一些像

这样的事情
int i =0;
for(int x:nums)
    counts[i++] = (x-low)++