Skip to content

Commit 1fcbe75

Browse files
add another solution for dutch flag,
add swap extension function to arrays
1 parent e25d0d1 commit 1fcbe75

File tree

2 files changed

+65
-24
lines changed

2 files changed

+65
-24
lines changed

.idea/workspace.xml

Lines changed: 24 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ch6Arrays/6.1DutchFlag.kt

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ch6Arrays
22

3+
import ch5PrimitiveTypes.swap
4+
35
fun main(args: Array<String>) {
46
solution1(arrayOf(3, 5, 4, 6, 7, 1, 2), 2).forEach {
57
print(it)
@@ -16,6 +18,12 @@ fun main(args: Array<String>) {
1618
solution3(arrayOf(3, 5, 4, 6, 7, 1, 2), 2).forEach {
1719
print(it)
1820
}
21+
22+
println()
23+
24+
solution4(arrayOf(3, 5, 4, 6, 7, 1, 2), 2).forEach {
25+
print(it)
26+
}
1927
}
2028

2129
// running time O(n), space complexity 0(n)
@@ -61,9 +69,7 @@ fun solution2(numbers: Array<Int>, pivotPosition: Int): Array<Int> {
6169
for (i in 0..numbers.size) {
6270
for (j in i + 1 until numbers.size) {
6371
if (numbers[j] < pivot) {
64-
val temp = numbers[i]
65-
numbers[i] = numbers[j]
66-
numbers[j] = temp
72+
numbers.swap(i, j)
6773
}
6874
}
6975
}
@@ -72,9 +78,7 @@ fun solution2(numbers: Array<Int>, pivotPosition: Int): Array<Int> {
7278
for (i in numbers.size-1 downTo 0) {
7379
for (j in i - 1 downTo 0) {
7480
if (numbers[j] > pivot) {
75-
val temp = numbers[i]
76-
numbers[i] = numbers[j]
77-
numbers[j] = temp
81+
numbers.swap(i, j)
7882
}
7983
}
8084
}
@@ -90,21 +94,44 @@ fun solution3(numbers: Array<Int>, pivotPosition: Int): Array<Int> {
9094

9195
for(i in 0 until numbers.size){
9296
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)
9798
}
9899
}
99100

100101
for(i in numbers.size-1 downTo 0){
101102
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)
106104
}
107105
}
108106

109107
return numbers
110108
}
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

Comments
 (0)