簡體   English   中英

更快地找到數組中的最小值和最大值

[英]Faster way to find min and max values in array

我想知道,編譯器的哪種方式會更快。 使用sort或循環方法顯示最小值和最大值。 對於編譯器或程序員來說,哪種方法更快?

我將循環方法作為注釋包含在內。

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);
        */

    }
}

對於未排序的數據,循環遍歷數組以查找最小值/最大值需要O(n)時間。 對於排序它將是恆定時間(O(1))但是據我所知,這不是你的情況。

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

此外,當編譯器可以為您優化某些內容時,情況並非如此。

通常最快的排序你可以是O(nlogn),循環數組將只是O(n)所以肯定循環

Arrays.sort()使用mergesort算法的一個版本,該算法在O(nlog(n))中運行。 通過線性搜索數組查找最大值和最小值只需要一次通過數組,使其成為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]; } 
    }

您可以使用JAVA 8 Stream API 我認為Stream必須更快,因為它不存儲元素。 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());

我已經測試了代碼並且工作正常。

與其他答案類似

public class FindMaxAndMinFromArray {
static void findMaxAndMin(int[] arrNum) {
    Arrays.sort(arrNum);//will sort original array
    System.out.println("Min number is : " + arrNum[0]);//After sorting 0 index will be min value
    System.out.println("Max Number is : " + arrNum[arrNum.length - 1]); //last index will be max value
}

public static void main(String[] args) {
    int myArr[] = { 75,10, 20,80,65, 30, 40, 50 };
    findMaxAndMin(myArr);
}
}

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

除非您的數據已經排序,否則排序總是需要比對所有條目的單個讀取更多的努力。

因此,在運行時排序只是找到min和max轉換為一定量的開銷。

當然:你的術語搞砸了。 編譯器將輸入轉換為輸出,它不關心您提供的代碼作為輸入的效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM