1
1
package divideandconquer
2
2
3
3
import scala .annotation .tailrec
4
+ import util .Utility .swap
4
5
5
6
/*
6
7
An implementation of the quick sort algorithm
@@ -12,34 +13,32 @@ object QuickSort extends App{
12
13
13
14
println(quickSort(arrayToSort).mkString(" " ))
14
15
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 ))
22
22
}
23
23
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
31
28
32
29
@ 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)
43
43
}
44
-
45
44
}
0 commit comments