0

配列のソートにかかる時間を記録するためにランタイム分析を実行しているこのバブルソートコードがあります。ループを使用して配列のサイズを増やす方法があるかどうか疑問に思っていましたか? 現時点では、一度に 100 ずつ手動でインクリメントしているため、5000 の配列サイズに到達する必要があります。

public class BubbleSortworking{
public static void main (String[] args) {
    Random rand = new Random();
    int myArray[] = new int[100];  //How to increment this using a loop
    int count, count2;
    count2 = 2;   //amount of times to run the loop

    //repeats the bubble sort, while also producing new arrays each time
    for (count = 0; count < count2; count++){
        for (int i = 0; i < myArray.length; i++){

            myArray[i] = rand.nextInt(100) + 1;  //produce numbers between 1 - ?
            //System.out.print(myArray[i] + ", ");   //displays unsorted array
        }

        bubble(myArray);

        // uncomment below 2 lines to prove each new sorted array cycle is unique 
        //for (int i = 0; i < myArray.length; i++)
        //  System.out.print(myArray[i] + ", ");
    }
}

public static void bubble(int myArray[]){
    int temp;
    long start = System.nanoTime();
    //System.out.println("start " + start);

    //for (count = 0; count < count2; count++){
    for (int i=0; i < myArray.length - 1; i++) {
        for(int j=myArray.length - 1; j > i; j--) {
            if (myArray[j] < myArray[j-1]){
                temp = myArray[j];
                myArray[j] = myArray[j-1];
                myArray[j-1] = temp;
            }
        }
    }

    long end = System.nanoTime();
    System.out.println(end - start);
    //System.out.println("elapsed time " + (end - start));


}

}

4

4 に答える 4

1

いいえ、一度作成した配列のサイズを変更することはできません。必要だと思うよりも大きく割り当てるか、サイズを大きくするために再割り当てする必要があるというオーバーヘッドを受け入れる必要があります。その場合は、新しいものを割り当てて、データを古いものから新しいものにコピーする必要があります。

于 2012-12-08T17:34:09.737 に答える
1

ArrayList を使用する必要があります。これにより、これが行われますが、余分なオーバーヘッドが発生します。

または、開始する前に配列をサイズ 5000 として割り当て、これまでに使用した要素の数を変数に記録することができます (array.length に依存するのではなく)。

または、より大きな新しい配列を作成し、すべての要素をそれにコピーして (System.arrayCopy(..))、新しい配列を配置することで、配列のサイズを変更できます。

于 2012-12-08T18:04:11.657 に答える
0

rizon の答えは正しいです。配列のサイズを変更することはできません。ところで、配列を再作成している場所はどこにもありません。また、5000 個の要素を処理している場所もわかりません。処理時間が気になる場合は、配列を再作成/サイズ変更したくないでしょう。これは非常に効率が悪いからです。別のソリューションが必要になります。

于 2012-12-08T18:06:41.620 に答える
0

これはあなたを助けるかもしれません

int[] intA = new int[100];
int sizeToIncrement = 100;
for(int i=0;i<5000;i++) {
   if(i== intA.length ) {
      intA = Arrays.copyOf(intA, intA.length + sizeToIncrement);
   }
   intA[i] = i;
}
于 2012-12-08T18:31:52.283 に答える