2016-10-02 14 views
0

だから私はランダムに生成された多数のリストに対してさまざまなソートアルゴリズムを実行する必要があります。次に、さまざまなアルゴリズムの実行時間を比較したレポートを提出する必要があります。これまで3つのソートアルゴリズムのコードを書きました:quicksort、mergesort、heapsort。私は基点だけを残しています。以下はコードです。このコードは、この行に私には、ArrayIndexOutOfBoundsExceptionがスローされます。RadixSortアルゴリズムの実行時間

b[--bucket[(a[i]/exp) % 10]] = a[i]; 

が、私はかなりそれが正しいにするためにコードを変更する方法を見つけ出すことはできません。

import java.util.*; 


public class RadixSort { 

    public static void main(String[] args) { 
     Random generator = new Random(System.currentTimeMillis()); 
     Scanner scan = new Scanner(System.in); 
     int size = scan.nextInt(); 
     int[] x = new int[size]; 

     long start = System.currentTimeMillis(); 

     for (int i = 0; i < size; i++) 
      x[i] = getRandomNumberInRange(0, 100); 

     radixSort(x); 
     System.out.println(Arrays.toString(x)); 
     long runtime = System.currentTimeMillis() - start; 
     System.out.println("Runtime: " + runtime); 
    }  

    private static int getRandomNumberInRange(int min, int max) { 
     if (min >= max) 
      throw new IllegalArgumentException("max must be greater than min"); 

     return (int)(Math.random() * ((max - min) + 1)) + min; 
    } 

    public static void radixSort(int[] a) { 
     int i, m = a[0], exp = 1, n = a.length; 
     int[] b = new int[10]; 

     for (i = 1; i < n; i++) 
      if (a[i] > m) 
       m = a[i]; 

     while (m/exp > 0) { 
      int[] bucket = new int[10]; 

      for (i = 0; i < n; i++) 
       bucket[(a[i]/exp) % 10]++; 
      for (i = 1; i < 10; i++) 
       bucket[i] += bucket[i - 1]; 
      for (i = n - 1; i >= 0; i--) 
       b[--bucket[(a[i]/exp) % 10]] = a[i]; 
      for (i = 0; i < n; i++) 
       a[i] = b[i]; 
      exp *= 10;   
     } 
    }  
} 
+0

これは、基数ソートの仕組みではありません。各バケットは、整数の配列を保持する必要があり、その後、各桁のメイン配列に再グループ化されます。 –

+0

私はあなたがより良く学ぶことができるように、ソリューション全体を提供したくありません。しかしこれはヒントです:あなたのバケツはArrayListとして宣言されるべきです [10]バケツ;そして、バケツ[数字]では、expで割った数字を最後の数字に置きます。 –

+0

解決策を残すこともできますが、b配列にa.lengthに等しいサイズを与える必要があります –

答えて

1

明示的int[] b配列の固定サイズ規定されているので、それは起こります:

int[] b = new int[10]; 

入力が10よりも大きい場合には、それはオーバーフローする理由です。

パラメータから配列の可変長に変更します。

int[] b = new int[a.length]; 

はまた私だけ間隔(0; n>で数字の入力の取得を修正することができreccomend。

関連する問題