2014-03-30 38 views
1

我想獲得不同數組大小的各種排序方法的總耗用時間。我能夠獲得大小= 100,1000,10000和100000的流逝時間,但是當我嘗試1000000時,它只是繼續運行而沒有給出結果(我假設1000000太大了?)。有沒有什麼辦法可以在合理的時間內使用nanoTime獲得經過的時間?任何幫助將是偉大的!Java:使用System.nanoTime()排序功能花費太長的時間來執行

我的程序:

import java.util.Random; 

public class Sorting { 

public static void printArray(int[] array) { 
    System.out.print("The Array: "); 
    for (int i = 0; i < array.length; i++) { 
     System.out.print(array[i] + " "); 
    } 
    System.out.println(); 
} 

public static void exchange(int[] array, int i, int j) { 
    int temp = array[i]; 
    array[i] = array[j]; 
    array[j] = temp; 
} 

public static void selectionSort(int[] array) { 
    for (int fill = 0; fill < array.length - 2; fill++) { 
     int minPos = fill; 
     for (int j = fill + 1; j < array.length; j++) { 
      if (array[j] < array[minPos]) { 
       minPos = j; 
      } 
     } 
     exchange(array, fill, minPos); 
    } 
} 

public static void bubbleSort(int[] array) { 
    for(int last = array.length - 1; last > 0; last--){ 
     for(int i = 0; i < last; i ++){ 
      if(array[i + 1] < array[i]){ 
       exchange(array, i, i + 1); 
      } 
     } 
    } 
} 


public static void main(String[] args) { 
    int size = 1000000; 
    Random rand = new Random(); 
    int[] arrayToSort = new int[size]; 
    for (int i = 0; i < size; i++) { 
     arrayToSort[i] = rand.nextInt(size); 
    } 

    //printArray(arrayToSort); 
    long startSelect = System.nanoTime();   
    selectionSort(arrayToSort); 
    long estSelectTime = System.nanoTime() - startSelect; 
    System.out.println("elapsed time after Selection sort for n = " + size + " : " + estSelectTime); 
    //printArray(arrayToSort); 
//  long startBubble = System.nanoTime();     
//  bubbleSort(arrayToSort); 
//  long estBubTime = (System.nanoTime() - startBubble)/size; 
//  System.out.println("elapsed time after Bubble sort for n = " + size + " : " + estBubTime); 
    //printArray(arrayToSort); 

} 

} 
+0

好的,有趣的問題,但你有沒有嘗試過,例如,Caliper?它是否重現了這種行爲? – fge

+3

爲什麼你認爲'nanoTime'花費的時間太長,而不是你的排序功能? –

+2

氣泡排序以二次方式運行,因此對於添加的每個零點,排序將花費100倍的時間。 – Thomas

回答

7

冒泡排序在二次時間運行,所以對於每個零添加,排序將需要100倍長。我想你可以在一瞬間對10,000個數字進行排序,但是可能需要幾秒鐘才能完成100,000個,因此至少需要幾分鐘才能完成1,000,000個。

0

如果我對

100K => 4.7 secs 
200K => 18.5 secs 
500K => 116.7 secos 
1000K => 4 mins (estimated) 

注運行:如果我改變選擇排序是這樣

public static void selectionSort(int[] array) { 
    for (int fill = 0; fill < array.length - 2; fill++) { 
     int minPos = fill; 
     int minValue = array[minPos]; 
     for (int j = fill + 1; j < array.length; j++) { 
      if (array[j] < minValue) { 
       minPos = j; 
       minValue = array[j]; 
      } 
     } 
     exchange(array, fill, minPos); 
    } 
} 

的200K需要14.6秒,而不是18.5。

相關問題