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