我正在为我的大学课程实施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];
}
}
}
答案 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)++