Skip to content

Commit 0f7bd4a

Browse files
committed
Modify quick sort to use immutable swap
1 parent 5c2dc90 commit 0f7bd4a

File tree

1 file changed

+24
-25
lines changed

1 file changed

+24
-25
lines changed
Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package divideandconquer
22

33
import scala.annotation.tailrec
4+
import util.Utility.swap
45

56
/*
67
An implementation of the quick sort algorithm
@@ -12,34 +13,32 @@ object QuickSort extends App{
1213

1314
println(quickSort(arrayToSort).mkString(" "))
1415

15-
def quickSort(inputArray : Array[Int]) : Array[Int] = inputArray match {
16-
case Array() => inputArray //empty array
17-
case Array(_) => inputArray //single element array
18-
case _ => //else
19-
val initialPivotPos = inputArray.length/2
20-
val finalPivotPos = giveFinalPivotPosAndModifyArray(initialPivotPos,inputArray)
21-
quickSort(inputArray.take(finalPivotPos)) ++ Array(inputArray{finalPivotPos}) ++ quickSort(inputArray.drop(finalPivotPos+1))
16+
def quickSort(arr: Array[Int]): Array[Int] = arr match {
17+
case Array() | Array(_) => arr
18+
case _ =>
19+
val pivotPos = arr.length/2
20+
val (newArray, finalPivotPos) = movePivotToCorrectPos(arr, pivotPos)
21+
quickSort(newArray.take(finalPivotPos)) ++ Array(newArray(finalPivotPos)) ++ quickSort(newArray.drop(finalPivotPos + 1))
2222
}
2323

24-
def swap(pos1 : Int, pos2 : Int)(array : Array[Int]) : Unit = {
25-
val temp = array{pos1}
26-
array{pos1} = array{pos2}
27-
array{pos2} = temp
28-
}
29-
30-
def giveFinalPivotPosAndModifyArray(initialPivotPos : Int,array : Array[Int]) : Int = {
24+
def movePivotToCorrectPos(array: Array[Int], pivotPos: Int): (Array[Int], Int) = {
25+
val pivot = array(pivotPos)
26+
val lowIndex = 1
27+
val highIndex = array.length - 1
3128

3229
@tailrec
33-
def internalFunc(headPos : Int, tailPos : Int): Int = if(headPos > tailPos) tailPos
34-
else if(array{headPos} > array{0}){
35-
swap(headPos,tailPos)(array)
36-
internalFunc(headPos,tailPos-1)
37-
} else internalFunc(headPos+1, tailPos)
38-
39-
swap(0,initialPivotPos)(array)
40-
val finalPivotPos = internalFunc(1,array.length-1)
41-
swap(0,finalPivotPos)(array)
42-
finalPivotPos
30+
def recur(arr: Array[Int], lI: Int, hI: Int): (Array[Int], Int) =
31+
if(lI > hI) (arr, hI)
32+
else if (arr(lI) > pivot) {
33+
val newArray = swap(arr, lI, hI)
34+
recur(newArray, lI, hI - 1)
35+
} else {
36+
recur(arr, lI + 1, hI)
37+
}
38+
39+
val mTemp = swap(array, 0, pivotPos) //move pivot to 0 index
40+
val (newArray, correctPivotPos) = recur(mTemp, lowIndex, highIndex)
41+
val finalArray = swap(newArray, 0, correctPivotPos) //move pivot to correct pos
42+
(finalArray, correctPivotPos)
4343
}
44-
4544
}

0 commit comments

Comments
 (0)