Swift-尋找數組中的最大值和最小值

題目:對于一個由N個整數組成的數組,需要比較多少次才能找出最大值和最小值的數.

常規解法

時間復雜度O(2N)
<pre><code>` func minMax(arr:[Int])->(Int,Int) {

    var min:Int = arr[0]
    var max:Int = arr[0]
    
    for i in 0..<arr.count {
        if arr[i] < min {
            min = arr[i]
        }
        
        if arr[i] > max {
            max = arr[i]
        }
    }
    
    return (min,max)
}`</code></pre>

解法二

由于最大的數和最小的數不會是同一個數(N!=1),可以把數組分成兩部分,然后再從這兩部分中分別找出最大的數和最小的數。首先按順序將數組中相鄰的兩個數分在同一組,接著比較同一組中奇數位數字和偶數位字,將較大的房子偶數位上,較小的數放在奇數位上,經過N/2次比較的預處理后,較大的數都放到了偶數位置上,較小的數則放到了奇數位置上,最后從奇偶數位上分別求出Max和min,各需要比較N/2次。整個算法共需要比較1.5*N次。
<pre><code>` func minMax1(arr:[Int]) -> (Int,Int) {

    var data:[Int] = arr
    var min:Int = data[0]
    var max:Int = data[0]
    
    for i in stride(from: 0, to: data.count - 1, by: 2) {
        if data[i] < data[i + 1]{
            swap(&data[i], &data[i+1])
        }
    }
    
    
    for i in stride(from: 0, to: data.count - 1, by: 2) {
        if  data[i] > max {
            max = data[i]
        }
        
        if data[i+1] < min {
            min = data[i+1]
        }

    }
    
    if data[data.count-1] > max {
        max = data[data.count - 1]
    }
    
    if data[data.count-1] < min {
        min = data[data.count - 1]
    }
    
    return (min,max)
}`</code></pre>

解法三

解法二需要改變原有數組中數據的位置,其實可以不比較其中的數字:
<pre><code>` func minMax2(arr:[Int]) -> (Int,Int) {

    var data:[Int] = arr
    var min:Int = data[0]
    var max:Int = data[0]
    
    for i in stride(from: 0, to: data.count - 1, by: 2) {
        let tempMax:Int = data[i] > data[i+1] ? data[i] : data[i+1]
        let tempMin:Int = data[i] < data[i+1] ? data[i] : data[i+1]
        if  tempMax > max {
            max = tempMax
        }
        
        if tempMin < min {
            min = tempMin
        }

    }
    
    if data[data.count-1] > max {
        max = data[data.count - 1]
    }
    
    if data[data.count-1] < min {
        min = data[data.count - 1]
    }
    
    return (min,max)
}`</code></pre>

測試代碼:
<pre><code>`var findArr:[Int] = [100,5,6,8,3,7,9,10,0,40,1,2]
var findResult1 = find.minMax(arr: findArr)
var findResult2 = find.minMax1(arr: findArr)
var findResult3 = find.minMax2(arr: findArr)

print("FlyElephant-最大最小的數值---(findResult1)---最小數組--(findResult2)---(findResult3)")`</code></pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容