1
1
package ch6Arrays
2
2
3
+ import ch5PrimitiveTypes.swap
4
+
3
5
fun main (args : Array <String >) {
4
6
solution1(arrayOf(3 , 5 , 4 , 6 , 7 , 1 , 2 ), 2 ).forEach {
5
7
print (it)
@@ -16,6 +18,12 @@ fun main(args: Array<String>) {
16
18
solution3(arrayOf(3 , 5 , 4 , 6 , 7 , 1 , 2 ), 2 ).forEach {
17
19
print (it)
18
20
}
21
+
22
+ println ()
23
+
24
+ solution4(arrayOf(3 , 5 , 4 , 6 , 7 , 1 , 2 ), 2 ).forEach {
25
+ print (it)
26
+ }
19
27
}
20
28
21
29
// running time O(n), space complexity 0(n)
@@ -61,9 +69,7 @@ fun solution2(numbers: Array<Int>, pivotPosition: Int): Array<Int> {
61
69
for (i in 0 .. numbers.size) {
62
70
for (j in i + 1 until numbers.size) {
63
71
if (numbers[j] < pivot) {
64
- val temp = numbers[i]
65
- numbers[i] = numbers[j]
66
- numbers[j] = temp
72
+ numbers.swap(i, j)
67
73
}
68
74
}
69
75
}
@@ -72,9 +78,7 @@ fun solution2(numbers: Array<Int>, pivotPosition: Int): Array<Int> {
72
78
for (i in numbers.size- 1 downTo 0 ) {
73
79
for (j in i - 1 downTo 0 ) {
74
80
if (numbers[j] > pivot) {
75
- val temp = numbers[i]
76
- numbers[i] = numbers[j]
77
- numbers[j] = temp
81
+ numbers.swap(i, j)
78
82
}
79
83
}
80
84
}
@@ -90,21 +94,44 @@ fun solution3(numbers: Array<Int>, pivotPosition: Int): Array<Int> {
90
94
91
95
for (i in 0 until numbers.size){
92
96
if (numbers[i] < pivot){
93
- val temp = numbers[leftIndex]
94
- numbers[leftIndex] = numbers[i]
95
- numbers[i] = temp
96
- leftIndex++
97
+ numbers.swap(leftIndex++ , i)
97
98
}
98
99
}
99
100
100
101
for (i in numbers.size- 1 downTo 0 ){
101
102
if (numbers[i] > pivot){
102
- val temp = numbers[rightIndex]
103
- numbers[rightIndex] = numbers[i]
104
- numbers[i] = temp
105
- rightIndex--
103
+ numbers.swap(rightIndex-- , i)
106
104
}
107
105
}
108
106
109
107
return numbers
110
108
}
109
+
110
+ /*
111
+ The idea here is that we mark regions, smaller than pivot on the left,
112
+ then the pivot, then unclassified elements left from the result of previous swapping
113
+ then bigger elements
114
+ */
115
+ fun solution4 (numbers : Array <Int >, pivotPosition : Int ): Array <Int > {
116
+ var smaller = 0
117
+ var equal = 0
118
+ val pivot = numbers[pivotPosition]
119
+ var bigger = numbers.size - 1
120
+
121
+ // while we have unclassified elements until all are classified iterate
122
+ while (equal < bigger){
123
+ when {
124
+ numbers[equal] < pivot -> numbers.swap(equal++ , smaller++ )
125
+ numbers[equal] > pivot -> numbers.swap(bigger-- , equal)
126
+ numbers[equal] == pivot -> equal++
127
+ }
128
+ }
129
+
130
+ return numbers
131
+ }
132
+
133
+ fun Array<Int>.swap (a : Int , b : Int ){
134
+ val tmp = this [a]
135
+ this [a] = this [b]
136
+ this [b] = tmp
137
+ }
0 commit comments