2017-05-26 50 views
1

我在想,編譯器的編譯速度會更快。 使用排序或循環方法顯示最小值和最大值。 哪一種編譯器或程序員更快的方法?查找數組中最小值和最大值的更快方法

我將循環方法作爲評論。

import java.util.Scanner; 
import java.util.Arrays; 

public class Day3 
{ 
    public static void main(String[] args) 
    { 
     Scanner scan = new Scanner(System.in); 
     System.out.println("Maximum and minimum value array"); 
     System.out.println("--------------------------------\n"); 

     //variable declaration 
     int amount; 
     int[] integerArray; 

     //set amount 
     System.out.print("Enter the amount of numbers to sort: "); 
     amount = scan.nextInt(); 
     integerArray = new int[amount]; 

     //input loop 
     System.out.print("Enter numbers: "); 
     for(int i = 0; i < amount; i++) 
     { 
      integerArray[i] = scan.nextInt(); 
     } 

     System.out.print("\nHere is your array: " + Arrays.toString(integerArray) + "\n"); 

     Arrays.sort(integerArray); 
     System.out.println("Min value = " + integerArray[0]); 
     System.out.println("Max value = " + integerArray[integerArray.length - 1]); 
     System.out.println("Median value = " + integerArray[(integerArray.length -1)/2]); 

     /* 
     int[] arr = new int[10]; 
     Scanner in = new Scanner(System.in); 
     int i, min=0, max=0; 
     for(i=0; i<=arr.length; i++) 
     { 
      System.out.print("Enter any number: "); 
      arr[i] = in.nextInt();   
     } 
     min = arr[0]; 
     for(i=0; i<=9; i++) 
     { 
      if(arr[i] > max) 
      { 
       max = arr[i]; 
      } 
      if(arr[i] < min) 
      { 
       min = arr[i]; 
      } 
     } 
     System.out.println("Maximum is: " + max); 
     System.out.println("Minimum is: " + min); 
     */ 

    } 
} 
+1

*「編譯器更快。」*? *「或程序員」*?您應該擔心的唯一速度性能是運行時性能。我還沒有看到代碼需要*更快*編譯和更快的程序員不清楚和100%與人有關。 – luk2302

+1

其實,這是錯誤的。有很多情況下「程序員更快」是很重要的......如果你的意思是程序員編寫和調試的速度更快! –

+0

@StephenC好吧,在幾乎每一個企業背景下都是如此。我有一個stute deadline的計劃。如果我不能減少編程某些功能的時間,我是****。同樣的事情關於調試(這很有趣,因爲它幾乎總是與之前完成的快速開發有關;)) – AxelH

回答

4

對於unosorted數據,循環在陣列上找到最小/最大需要O(n)的時間。對於排序它會是恆定的時間(O(1)),但據我瞭解,這不是你的情況。

最快的排序算法在O(n * log(n))中工作,所以線性掃描(循環)是最快的選項。

另外,編譯器可以爲你優化某些東西時情況並非如此。

+0

如果數據排序後發現最小值和最大值是恆定時間,只需訪問第一個或最後一個元素 –

+0

當然,我可能需要一些咖啡。修復。 – syntagma

2

在你可以將O(nlogn)一般最快的排序,循環陣列上方將只是爲O(n),所以肯定循環

0

迭代一個列表/陣列識別的最小和最大條目可以一次完成。

而且除非您的數據已經排序,否則排序總是需要比讀取所有條目更多的工作量。

因此,在運行時排序,只是發現最小和最大轉化爲一定量的開銷。

當然:你的術語是混亂的。編譯器將輸入轉換爲輸出,它並不關心你作爲輸入提供的代碼的效率。

+1

勇敢downvoter的任何意見? – GhostCat

1

Arrays.sort()使用在O(nlog(n))中運行的mergesort算法的一個版本。通過數組的線性搜索來查找最大值和最小值只需要一次通過數組,使其成爲O(n)。

通常,線性搜索循環方法運行得更快。您還可以結合最大/最小的數據輸入尋找提高效率:

int[] arr = new int[10]; 
    Scanner in = new Scanner(System.in); 
    int i, min=Integer.MAX_VALUE, max=Integer.MIN_VALUE; 
    for(i=0; i<=arr.length; i++) 
    { 
     System.out.print("Enter any number: "); 
     arr[i] = in.nextInt(); 
     if (arr[i]>max) { max = arr[i]; } 
     if (arr[i]<min) { min = arr[i]; } 
    } 
1

您可以使用JAVA 8 Stream API。我認爲Stream必須更快,因爲它不存儲元素。流直接處理所需的元素。

代碼示例:

List<Integer> integerList = Arrays.asList(1,2,13,4,15,6,17,8,19); 
System.out.println("List of Ints= " +integerList); 
IntSummaryStatistics intStats = integerList.stream().mapToInt((x) ->x).summaryStatistics(); 
System.out.println("Max Number= " + intStats.getMax()); 
System.out.println("Min Number= " + intStats.getMin()); 

我已經測試&正常工作的代碼。

+0

它不會比循環更快。 – syntagma

相關問題