0
class HeapSort{
   public static void main(String args[]){
      int A[]={6,5,4,3,2,1};
      HeapSor obj=new HeapSor(6);
      obj.Heap_Sort(A);
      obj.print(A);
   }
}


class HeapSor{

    int lenOfArray;
    int HeapSize;

    HeapSor(int len){
    this.lenOfArray=len;
    this.HeapSize=len;
    }

    void Heap_Sort(int A[]){
    for(int i=0; i<lenOfArray; i++){
        BuiltHeap(A);
        HeapSize--;
        swap(A,i,lenOfArray-i);
    }
    }

    void BuiltHeap(int A[]){
    for(int i=lenOfArray/2; i>=0; i--)
        MaxHeapify(A,i);
    }

    void MaxHeapify(int A[],int i){
    int l=2*i;
    int r=2*i+1;
    int max=i;

    if(i>HeapSize)
        return;
    if(A[l]>A[r])
        max=l;
    else
        max=r;

    if(A[i]<A[max])
        swap(A,i,max);
    //max=i;
    }

    void swap(int A[],int i,int j){
    if(i==j)
        return;

    int temp=A[i];
    A[i]=A[j];
    A[j]=temp;
    }

    void print(int A[]){
    for(int i=0; i<lenOfArray; i++)
        System.out.print(A[i]+" ");

    System.out.println();
    }
}

コンパイルすると、このエラーが発生しました

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at HeapSor.MaxHeapify(HeapSort.java:41)
    at HeapSor.BuiltHeap(HeapSort.java:31)
    at HeapSor.Heap_Sort(HeapSort.java:23)
    at HeapSort.main(HeapSort.java:5)

私は本当に何が間違っているのかを試してみましたが、失敗しました.誰かが私の間違っていることを教えてくれますか?

私の悪い英語でごめんなさい

4

4 に答える 4

2

最初に 2 つの問題があります (さらに多くの問題が発生します)。

1) Java は C ではありません。別の変数を渡さないでA使用する長さを見つけます。A.length

2) l と r の計算が壊れています。6/2=を渡し、インデックスに対してand ( and ) を3取得します。どちらも有効ではありません。2*32*3+167

于 2013-02-07T21:43:28.497 に答える
1

私の推測では、あなたの問題はここにあります: void MaxHeapify(int A[],int i)

左右の子を割り当てます。

int l=2*i;  
int r=2*i+1; 

しかし、それらが範囲外かどうかはチェックしません。をチェックしiます。

if(i>HeapSize)  
        return;

しかし2*i、範囲外になる可能性があり、それを使用します:

 if(A[l]>A[r])  
        max=l;  
    else  
        max=r;  
于 2013-02-07T21:44:16.650 に答える