1
1
// Compare each item to find minimum
2
2
func minimum< T: Comparable > ( _ array: [ T ] ) -> T ? {
3
- var array = array
4
3
guard !array. isEmpty else {
5
4
return nil
6
5
}
7
-
8
- var minimum = array. removeFirst ( )
9
- for element in array {
6
+
7
+ var minimum = array. first!
8
+ for element in array. dropFirst ( ) {
10
9
minimum = element < minimum ? element : minimum
11
10
}
12
11
return minimum
13
12
}
14
13
15
14
// Compare each item to find maximum
16
15
func maximum< T: Comparable > ( _ array: [ T ] ) -> T ? {
17
- var array = array
18
16
guard !array. isEmpty else {
19
17
return nil
20
18
}
21
-
22
- var maximum = array. removeFirst ( )
23
- for element in array {
19
+
20
+ var maximum = array. first!
21
+ for element in array. dropFirst ( ) {
24
22
maximum = element > maximum ? element : maximum
25
23
}
26
24
return maximum
27
25
}
28
26
29
27
// Compare in pairs to find minimum and maximum
30
28
func minimumMaximum< T: Comparable > ( _ array: [ T ] ) -> ( minimum: T , maximum: T ) ? {
31
- var array = array
32
29
guard !array. isEmpty else {
33
30
return nil
34
31
}
35
-
32
+
36
33
var minimum = array. first!
37
34
var maximum = array. first!
38
-
35
+
36
+ // if 'array' has an odd number of items, let 'minimum' or 'maximum' deal with the leftover
39
37
let hasOddNumberOfItems = array. count % 2 != 0
40
- if hasOddNumberOfItems {
41
- array. removeFirst ( )
42
- }
43
-
44
- while !array. isEmpty {
45
- let pair = ( array. removeFirst ( ) , array. removeFirst ( ) )
46
-
38
+ let start = hasOddNumberOfItems ? 1 : 0
39
+ for i in stride ( from: start, to: array. count, by: 2 ) {
40
+ let pair = ( array [ i] , array [ i+ 1 ] )
41
+
47
42
if pair. 0 > pair. 1 {
48
43
if pair. 0 > maximum {
49
44
maximum = pair. 0
@@ -60,7 +55,7 @@ func minimumMaximum<T: Comparable>(_ array: [T]) -> (minimum: T, maximum: T)? {
60
55
}
61
56
}
62
57
}
63
-
58
+
64
59
return ( minimum, maximum)
65
60
}
66
61
0 commit comments