2017-05-08 149 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