diff --git a/Sorting/QuickSort.js b/Sorting/QuickSort.js new file mode 100644 index 0000000..6fe90eb --- /dev/null +++ b/Sorting/QuickSort.js @@ -0,0 +1,55 @@ +const quickSort = (arr, start, end) => { + + if(start < end) { + + // You can learn about how the pivot value is derived in the comments below + let pivot = partition(arr, start, end) + + // Make sure to read the below comments to understand why pivot - 1 and pivot + 1 are used + // These are the recursive calls to quickSort + quickSort(arr, start, pivot - 1) + quickSort(arr, pivot + 1, end) + } + +} + +const partition = (arr, start, end) => { + let pivot = end + // Set i to start - 1 so that it can access the first index in the event that the value at arr[0] is greater than arr[pivot] + // Succeeding comments will expound upon the above comment + let i = start - 1 + let j = start + + // Increment j up to the index preceding the pivot + while (j < pivot) { + + // If the value is greater than the pivot increment j + if (arr[j] > arr[pivot]) { + j++ + } + + // When the value at arr[j] is less than the pivot: + // increment i (arr[i] will be a value greater than arr[pivot]) and swap the value at arr[i] and arr[j] + else { + i++ + swap(arr, j, i) + j++ + } + + } + + //The value at arr[i + 1] will be greater than the value of arr[pivot] + swap(arr, i + 1, pivot) + + //You return i + 1, as the values to the left of it are less than arr[i+1], and values to the right are greater than arr[i + 1] + // As such, when the recursive quicksorts are called, the new sub arrays will not include this the previously used pivot value + return i + 1 +} + +const swap = (arr, firstIndex, secondIndex) => { + let temp = arr[firstIndex] + arr[firstIndex] = arr[secondIndex] + arr[secondIndex] = temp +} + +quickSort(arr, 0, arr.length - 1) \ No newline at end of file