Select minimum in a range, and replace from the starting pointer
Replace [0] with min( [0,n-1] ), then [1] with min( [1,n-1] ) …
for( let i=0; i<nums.length; i++) { let min = Infinity; let mini = -1; for( let i2 = i; i2<nums.length; i2++) { if( nums[i2] < min ) { min = nums[i2]; mini = i2; } } swap(nums, i, mini); } return nums;
Bubble Sort
Bubbles go high
So make the largest num go to the last by swapping adjacent elements
function bubbleSort(nums) { let i = 0; while( (i+1) < nums.length ) { if( nums[i] > nums[i+1] ) { let temp = nums[i]; nums[i] = nums[i+1]; nums[i+1] = temp; i=0; // This is important, this makes the loop to restart from 0 } else { i++; } } return nums;}
Insertion Sort
In a increasing range like [0,i-1] make the i-1 element in the correct place by swapping back
function insertionSort(nums) { for(let i=1; i<nums.length; i++) { for(let j=i; j>0; j--) { if( nums[j-1] <= nums[j] ) break; // Since its in correct position swap(nums, j, j-1); } } return nums;}
Merge Sort
Divide the array, and then merge into one by comparing from the divided
function mergeSort(nums) { divide(nums, 0, nums.length-1); return nums;}function divide(nums, l, r){ if( l<r ) { let m = Math.floor((l + r) / 2);; divide(nums, l, m); divide(nums, m+1, r); merge(nums, l, m, r); }}function merge(nums, l, m, r) { //Slice is slice(start-0-based-index, end-1-based-index) let larr = nums.slice(l,m+1); let rarr = nums.slice(m+1,r+1); let k = l; let ll = 0; let rr = 0; while( ll<larr.length && rr<rarr.length ) { if( larr[ll] <= rarr[rr] ) { nums[k] = larr[ll++]; } else { nums[k] = rarr[rr++]; } k++; } while( ll<larr.length ) { nums[k++] = larr[ll++]; } while( rr<rarr.length ) { nums[k++] = rarr[rr++]; }}
Quick-Sort
Select a pivot, place it at its correct position, return the partition
user partition to sort the left and right array
class Solution { quickSort(nums) { let n = nums.length; this.qs(nums, 0, n - 1); return nums; } // The quicksort helper function qs( nums, low, high ) { if( low < high ) { // Get let pIndex = this.pivotSort(nums, low, high); this.qs(nums, low, pIndex - 1); this.qs(nums, pIndex + 1, high); } } pivotSort( nums, low, high ) { let pivot = nums[low]; let i = low; let j = high; while( i<j ) { while( i <= high-1 && nums[i] <= pivot ) { i++; } while( j>=low+1 && nums[j] > pivot ){ j--; } if( i<j ) { [nums[i], nums[j]] = [nums[j], nums[i]]; } } [nums[low], nums[j]] = [nums[j], nums[low]]; return j; }}