題目:對于一個由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>