2017-05-08 147 views
0

我正在編寫一個程序來比較不同的排序方法。我隨機生成了100,000個整數並將這些數據存儲到一個數組中。我想將相同的數組應用於不同的排序方法以進行比較。 (我認爲爲每種方法創建類可能會解決我的問題,但我不想創建太多的類)。所以我決定在這個類下創建一個名爲Sorts的類和一些排序函數。我想我的排序陣列重置爲未排序,以便將相同的數組應用於不同的排序方法。誰能告訴我如何?如何重新排序的數組在Java中未排序?

生成數據:

int size = Integer.parseInt(br.readLine()); 
    int [] data = new int[size]; 
    for (int i = 0; i< size; i++){ 
     data[i] = (int)(Math.random()*(10*size)); 
     System.out.print(data[i]+" "); 
    } 

創建對象:

Sorts sort = new Sorts(size, data); 

調用:

switch(index){ 
      case "1" : 
       System.out.print("\nYou select bubble sort\n"); 
       sort.bubbleSort(); 
       break; 
      case "2" : 
       System.out.print("You select quick sort\n"); 
       sort.quickSort(); 
       break; 

我的類:

class Sorts{ 
    private int size; 
    private int data[]; 
    Sorts(int size, int [] data){ 
     this.size = size; 
     this.data = data; 
    } 

    protected void bubbleSort(){ 
     int temp = 0; 
     for (int i = 0; i< (data.length-1); i++){ 
      for (int j = 0; j<(data.length-1);j++){ 
       if(data[j]>data[j+1]){ 
        temp = data[j]; 
        data[j] = data[j+1]; 
        data[j+1]= temp; 
       } 
      } 
     } 
     printResult(); 

    } 


    protected void quickSort(){ 

    } 

    protected void resetData(){ 

    } 
} 
+1

以及你可以做一個原始數組的副本,並對其進行排序。或谷歌knuth洗牌。 – e4c5

+1

你最好的選擇是生成原始數組。然後複製數組並將其傳遞給排序算法。你可以嘗試跟蹤原始位置,但是這看起來像更多的開銷'System.arrayCopy(...)' – KevinO

+2

在使用它排序之前創建一個未排序數組的副本: sortedArray = new int [unsortedArray.length]; System.arraycopy(unsortedArray,0,sortedArray,0,unsortedArray.length); – Aditya

回答

1

嗯,你可以使用Collections.shuffle,它需要一個'List'參數。這顯然意味着將你的'int []'轉換爲'List'(並再次返回)。

另一方面,不是像現在這樣實施它,我認爲最好使用策略模式來實現像這樣的多種排序機制。例如:

interface Sort { 
    void sort(int data[], int size); 
} 

class QuickSort implements Sort { 
    void sort(int data[], int size) { 
     ... 
    } 
}  

class MergeSort implements Sort { 
    void sort(int data[], int size) { 
     ... 
    } 
} 

etc... 

作爲再一旁白:

  • 這只是排序整數所以考慮如何排序任何類型的(也許是仿製藥)。
  • 某些類型(例如MergeSort)是穩定的,並使用新數組來表示排序後的數據。你怎麼能把它返回給調用者?您不能將'數據'設置爲新陣列。
+0

謝謝你的想法。到目前爲止,我通過使用數組副本解決。我也會嘗試你的想法。 – Jeffery

+0

這很好Jeffery。爲了您的目的,我認爲它同樣好。可能值得熟悉'Arras'和'Collections'實用類。祝你好運學習排序算法。 – wmorrison365

0

我認爲對於用例OP似乎有,陣列只需要一個洗牌,這種方法改組雖然沒有保證,這將它恢復到初始的陣列

private void reset(final int arr[]) { 
    Random rand = new Random(); 

    for (int i = 0; i < arr.length; i++) { 
     int nextInt = rand.nextInt(arr.length); 
     int temp = arr[i]; 
     arr[i] = arr[nextInt]; 
     arr[nextInt] = temp; 
    } 
} 
0

您可以使用類集合

Collection.shuffle(yourList); 

的方法洗牌這將自動隨機播放列表,而無需實施自己的功能。 之後,您可以將列表轉換回數組。 :)

+0

謝謝你的想法!我會嘗試。 – Jeffery