首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于LSD基数排序的问题

关于LSD基数排序的问题
EN

Stack Overflow用户
提问于 2010-05-31 14:28:35
回答 1查看 658关注 0票数 0

我有以下代码:

代码语言:javascript
复制
public class LSD{
    public static int R=1<<8;
    public static int bytesword=4;
    public static void radixLSD(int a[],int l,int r){
        int  aux[]=new int[a.length];

        for (int d=bytesword-1;d>=0;d--){
            int i, j;
            int count[]=new int[R+1];
            for ( j=0;j<R;j++) count[j]=0;
            for (i=l;i<=r;i++)
                count[digit(a[i],d)+1]++;
            for (j=1;j<R;j++)
                count[j]+=count[j-1];
            for (i=l;i<=r;i++)
                aux[count[digit(a[i],d)]++]=a[i];
            for (i=l;i<=r;i++)
                a[i]=aux[i-1]; // <-- Line 19
        }
    }

    public static void main(String[]args){
        int a[]=new int[]{3,6,5,7,4,8,9};
        radixLSD(a,0,a.length-1);

        for (int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }
    }

    public static int digit(int n,int d){
        return (n>>d)&1;
    }
}

在运行时,它会抛出以下异常:

代码语言:javascript
复制
java.lang.ArrayIndexOutOfBoundsException: -1
 at LSD.radixLSD(LSD.java:19)
 at LSD.main(LSD.java:29)

为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-31 15:00:32

我对基数排序的了解还不够多,不知道你的代码应该是什么,但是为什么它现在失败了,这是非常清楚的。您正在调用radixLSD并为l传递0

代码语言:javascript
复制
radixLSD(a,0,a.length-1);

当你看到这段代码时:

代码语言:javascript
复制
for (i=l;i<=r;i++)
    a[i]=aux[i-1];

在第一次传递中,i被设置为l (0),您尝试执行aux[i-1]aux[-1],这是越界的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2941749

复制
相关文章

相似问题

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