2017-09-17 9 views
1

私はこのプロジェクトに、異なる配列の実行時間を見つける必要があるところに割り当てられています。私の配列は、選択配列からバブル、バブルから挿入、およびマージに移動する部分を除いて、完全に正常に機能しています。問題は、1から1000の間の乱数が選択ソートに渡され、ソートされた配列がソートメソッドの残りの部分に渡されるときです。私はもう一度私のコードを通過しようとしたが、私は問題が何かを見つけることができません。私は配列や何かを設定するはずですか?すべてのヘルプは 並べ替え方法に配列を渡して実行時間を調べる

package sorting; 

import java.util.Arrays; 
import java.util.Random; 
import java.lang.Math; 
import java.io.*; 
import java.util.*; 

public class sorting { 

public static void main(String[] args) { 

    double[] arr1 = getArray(10000); 
    double[] arr2 = getArray(20000); 
    double[] arr3 = getArray(40000); 
    double[] arr4 = getArray(80000); 

    System.out.println("Problem 1: Selection sort, Bubble sort, Insertion sort, and Merge sort with thier execution time"); 
    System.out.println(""); 

    System.out.printf("%12s%15s%15s%17s%13s\n", "Number of Elements |", "Selection Sort", "Bubble Sort", "Insertion Sort", "Merge Sort"); 
    System.out.println("--------------------------------------------------------------------------------"); 

    long b = System.currentTimeMillis(); 
    long startTime = System.currentTimeMillis(); 

    selectionSort(arr1); 
    long endTime = System.currentTimeMillis(); 
    long executionTime = endTime - startTime; 
    System.out.printf("%11s", arr1.length); 
    System.out.printf("%18s%2s", executionTime, " ms"); 


    startTime = System.currentTimeMillis(); 
    bubbleSort(arr1); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    insertionSort(arr1); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    (new MergeSort()).mergeSort(arr1); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s\n", executionTime, " ms"); 

    System.out.printf("%11s", arr2.length); 
    startTime = System.currentTimeMillis(); 
    selectionSort(arr2); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%18s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    bubbleSort(arr2); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    insertionSort(arr2); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    (new MergeSort()).mergeSort(arr2); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s\n", executionTime, " ms"); 

    System.out.printf("%11s", arr3.length); 
    startTime = System.currentTimeMillis(); 
    bubbleSort(arr3); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%18s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    bubbleSort(arr3); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    insertionSort(arr3); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    (new MergeSort()).mergeSort(arr3); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s\n", executionTime, " ms"); 

    System.out.printf("%11s", arr4.length); 
    startTime = System.currentTimeMillis(); 
    bubbleSort(arr4); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%18s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    bubbleSort(arr4); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    insertionSort(arr4); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s", executionTime, " ms"); 

    startTime = System.currentTimeMillis(); 
    (new MergeSort()).mergeSort(arr4); 
    endTime = System.currentTimeMillis(); 
    executionTime = endTime - startTime; 
    System.out.printf("%12s%2s\n", executionTime, " ms"); 


} 

public static double[] getArray(int n){ 
    double[] arr = new double[n]; 
    for(int i=0; i<n; i++){ 
     arr[i] = ((double)(Math.random()*1000)); 
    } 
    return arr; 
} 


public static void selectionSort(double[] arr) { 
    for (int i = 0; i < arr.length - 1; i++) { 

     double min = arr[i]; 
     int currentMin = i; 
     for (int j = i + 1; j < arr.length; j++) { 
      if (min > arr[j]) { 
       min = arr[j]; 
       currentMin = j; 
      } 
     } 
     if (currentMin != i) { 
      arr[currentMin] = arr[i]; 
      arr[i] = min; 

     } 
    } 

} 

public static double[] insertionSort(double[] arr) { 
    double temp; 
    for (int i = 1; i < arr.length; i++) { 

     for (int j = i; j > 0; j--) { 
      if (arr[j] < arr[j - 1]) { 
       temp = arr[j]; 
       arr[j] = arr[j - 1]; 
       arr[j - 1] = temp; 
      } 
     } 
    } 
    return arr; 
} 

public static double[] bubbleSort(double[] arr) { 
    double temp; 
    for (int i = 0; i < arr.length; i++) { 
     // bubble up 
     for (int j = 0; j < arr.length - 1 - i; j++) { 
      if (arr[j] > arr[j + 1]) { 
       temp = arr[j]; 
       arr[j] = arr[j + 1]; 
       arr[j + 1] = temp; 

      } 
     } 
    } 
    return arr; 
} 

public static class MergeSort { 

    private double[] array; 
    private double[] temp; 
    private int length; 

    public double[] mergeSort(double[] arr) { 
     this.array = arr; 
     this.length = arr.length; 
     this.temp = new double[length]; 
     merge1(0, length - 1); 
     return arr; 
    } 

    private void merge1(int left, double right) { 

     if (left < right) { 
      double middle = left + (right - left)/2; 
      merge1(left, middle); 
      merge1((int) (middle + 1), right); 
      merge2(left, middle, right); 
     } 
    } 

    private void merge2(int left, double middle, double right) { 

     for (int i = left; i <= right; i++) { 
      temp[i] = array[i]; 
     } 
     int i = left; 
     int j = (int) (middle + 1); 
     int k = left; 
     while (i <= middle && j <= right) { 
      if (temp[i] <= temp[j]) { 
       array[k] = temp[i]; 
       i++; 
      } else { 
       array[k] = temp[j]; 
       j++; 
      } 
      k++; 
     } 
     while (i <= middle) { 
      array[k] = temp[i]; 
      k++; 
      i++; 
     } 

    } 
} 
} 

この

を高く評価している

は私が 問題1のような出力を得ているものです:選択ソート、バブルソート、挿入ソート、およびthier実行時間とソートマージ

Number of Elements | Selection Sort Bubble Sort Insertion Sort Merge 
Sort 
---------------------------------------------------------------------------- 

    10000    85 ms   31 ms   31 ms   16 ms 
    20000    385 ms   100 ms   123 ms   10 ms 
    40000    3085 ms   401 ms   347 ms   8 ms 
    80000    13231 ms  1972 ms  1484 ms   35 ms 
+0

は、選択ソートの後に他の人が得ることの問題です処理するソートされた配列? – nullpointer

+0

あなたの出力は、さまざまなソート方法の複雑さに基づいて妥当に見えます。ここでデバッガを使って問題が発生している行を見つけようとしましたか?ほとんどのSOユーザーは、IDEでテストするのではなく、貼り付けたコード全体を読む時間がありません。 –

+0

はい。彼らは別のソート方法に移動するたびに新しい配列を受け取ることになっています –

答えて

0

問題は、1から1000の間の乱数が で、選択ソートに渡されてソートされ、ソートされた配列が 配列の場合ですあなたは

呼び出すときに、配列 arr1の値を渡しているので、これは、あなたのために Is Java "pass-by-reference" or "pass-by-value"?

で原因のルートを見つけるものソート方法

の残りの部分に渡されたばかり

selectionSort(arr1); 

arr1に行われた操作は、arr1を更新します。あなたがあなたの既存の方法からランダムに生成された配列を使用するようにコードを更新することができます

bubbleSort(arr1); // this uses the updated array. 

にこれを渡し、次の時間:

selectionSort(getArray(10000)); // similarily for other cases 
+1

どうすれば修正できますか?私は異なる変数で合計16の配列を作成しなければなりませんか? @Jason Smith。 –

+0

答えで更新されました。理想的には、処理時間を評価し、データやそのコンテキストを格納しない場合は、配列を作成する必要はありません。 – nullpointer

+1

ありがとう。私はかなり新しいプログラミングです。私は昨年のコーディングを開始しましたので、私はまだ学習者です –

関連する問題