Algorithms: Implement Quick Sort
This commit is contained in:
parent
f0b0d87d05
commit
016f31d703
65
Algorithms/quicksort.js
Normal file
65
Algorithms/quicksort.js
Normal file
@ -0,0 +1,65 @@
|
||||
// https://www.freecodecamp.org/learn/coding-interview-prep/algorithms/implement-quick-sort
|
||||
|
||||
function quickSort(array) {
|
||||
// Only change code below this line
|
||||
const swap = (array, indexA, indexB) => {
|
||||
const temp = array[indexA];
|
||||
array[indexA] = array[indexB];
|
||||
array[indexB] = temp;
|
||||
};
|
||||
|
||||
const medianIndex = (array, indexA, indexB, indexC) => {
|
||||
const lowerIndex = array[indexA] < array[indexB] ? indexA : indexB;
|
||||
const higherIndex = array[lowerIndex] > array[indexC] ? lowerIndex : indexC;
|
||||
const pivotIndex =
|
||||
array[indexA] < array[higherIndex] ? indexA : higherIndex;
|
||||
return pivotIndex;
|
||||
};
|
||||
|
||||
const partition = (array, startIndex, endIndex) => {
|
||||
const midIndex = Math.floor(startIndex + (endIndex - startIndex) / 2);
|
||||
const pivotIndex = medianIndex(array, startIndex, midIndex, endIndex);
|
||||
const pivot = array[pivotIndex];
|
||||
swap(array, pivotIndex, endIndex);
|
||||
let lowIndex = startIndex;
|
||||
let highIndex = endIndex - 1;
|
||||
while (lowIndex < highIndex) {
|
||||
for (; lowIndex < highIndex; lowIndex++) {
|
||||
if (array[lowIndex] > pivot) break;
|
||||
}
|
||||
for (; highIndex >= lowIndex; highIndex--) {
|
||||
if (array[highIndex] < pivot) break;
|
||||
}
|
||||
if (lowIndex < highIndex) swap(array, lowIndex, highIndex);
|
||||
}
|
||||
if (array[lowIndex] > array[endIndex]) {
|
||||
swap(array, lowIndex, endIndex);
|
||||
return lowIndex;
|
||||
}
|
||||
return endIndex;
|
||||
};
|
||||
|
||||
// To-do: make it non-recursive
|
||||
const quicksort_ = (array, startIndex, endIndex) => {
|
||||
if (startIndex < endIndex) {
|
||||
const pivotIndex = partition(array, startIndex, endIndex);
|
||||
if (pivotIndex - 1 > startIndex)
|
||||
quicksort_(array, startIndex, pivotIndex - 1);
|
||||
if (pivotIndex + 1 < endIndex)
|
||||
quicksort_(array, pivotIndex + 1, endIndex);
|
||||
}
|
||||
};
|
||||
|
||||
quicksort_(array, 0, array.length - 1);
|
||||
|
||||
return array;
|
||||
// Only change code above this line
|
||||
}
|
||||
|
||||
console.log(
|
||||
quickSort([
|
||||
1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92,
|
||||
])
|
||||
);
|
||||
|
||||
console.log(quickSort([2, 6, 5, 3, 8, 7, 1, 0]));
|
Loading…
Reference in New Issue
Block a user