Last active
December 14, 2015 03:29
-
-
Save hamecoded/5021752 to your computer and use it in GitHub Desktop.
QuickSort algorithm in JavaScript : Accompanies the YouTube video "Visual Demonstration of the QuickSort Algorithm" : http://www.youtube.com/watch?v=Z5nSXTnD1I4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Accompanies the video "Visual Demonstration of the QuickSort Algorithm" | |
| * http://www.youtube.com/watch?v=Z5nSXTnD1I4 | |
| **/ | |
| function profileQuickSort(a){ | |
| var comparisons = 0; | |
| var swaps = 0; | |
| var func_calls = 0; | |
| /** | |
| * a recursive function, each time it positions the left most element in its correct index, | |
| * then it recurse its left and right sides | |
| **/ | |
| function quicksort(a){ | |
| ++func_calls; | |
| if(a.length < 2) return a; | |
| console.log("call: " + a.toLocaleString()); | |
| //position first element | |
| var lf = 0, | |
| rt = a.length -1, | |
| lf_pivot = true; //the pivot is on the left pointer | |
| while(lf != rt ){ | |
| console.log(">> " + a.join() + "=> pointers: left@" + lf + " right@" + rt ); | |
| ++comparisons; | |
| if( a[lf] > a[rt] ){ | |
| lf_pivot = !lf_pivot; | |
| //swap | |
| var tmp = a[lf]; | |
| a[lf] = a[rt]; | |
| a[rt] = tmp; | |
| ++swaps; | |
| } | |
| lf_pivot ? rt-- : lf++; | |
| } | |
| console.log(">> " + a.join() + "=> pointers collision @ " + rt ); | |
| if(a.length == 2) { | |
| return a; | |
| }else{ | |
| return [].concat( quicksort(a.slice(0,rt)), | |
| a[rt], | |
| quicksort( a.slice(rt+1) ) //out of bound index will return an empty array | |
| ); | |
| } | |
| }//end quicksort | |
| console.log( "output: " + quicksort(a) ); | |
| console.log( "array length: " + a.length + | |
| ", comparisons: " + comparisons + | |
| ", swaps: " + swaps + | |
| ", function calls: " + func_calls); | |
| } | |
| profileQuickSort([4,8,1,6,3,7,2,5]); | |
| /** | |
| call: 4,8,1,6,3,7,2,5 | |
| >> 4,8,1,6,3,7,2,5=> pointers: left@0 right@7 | |
| >> 4,8,1,6,3,7,2,5=> pointers: left@0 right@6 | |
| >> 2,8,1,6,3,7,4,5=> pointers: left@1 right@6 | |
| >> 2,4,1,6,3,7,8,5=> pointers: left@1 right@5 | |
| >> 2,4,1,6,3,7,8,5=> pointers: left@1 right@4 | |
| >> 2,3,1,6,4,7,8,5=> pointers: left@2 right@4 | |
| >> 2,3,1,6,4,7,8,5=> pointers: left@3 right@4 | |
| >> 2,3,1,4,6,7,8,5=> pointers collision @ 3 | |
| call: 2,3,1 | |
| >> 2,3,1=> pointers: left@0 right@2 | |
| >> 1,3,2=> pointers: left@1 right@2 | |
| >> 1,2,3=> pointers collision @ 1 | |
| call: 6,7,8,5 | |
| >> 6,7,8,5=> pointers: left@0 right@3 | |
| >> 5,7,8,6=> pointers: left@1 right@3 | |
| >> 5,6,8,7=> pointers: left@1 right@2 | |
| >> 5,6,8,7=> pointers collision @ 1 | |
| call: 8,7 | |
| >> 8,7=> pointers: left@0 right@1 | |
| >> 7,8=> pointers collision @ 1 | |
| output: 1,2,3,4,5,6,7,8 | |
| array length: 8, comparisons: 13, swaps: 9, function calls: 7 | |
| **/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Accompanies the video "Visual Demonstration of the QuickSort Algorithm" | |
| * http://www.youtube.com/watch?v=Z5nSXTnD1I4 | |
| **/ | |
| /** | |
| * a recursive function, each time it positions the left most element in its correct index, | |
| * then it recurse its left and right sides | |
| **/ | |
| function quicksort(a){ | |
| if(a.length < 2) return a; | |
| console.log("call: " + a.toLocaleString()); | |
| //position first element | |
| var lf = 0, | |
| rt = a.length -1, | |
| lf_pivot = true; //the pivot is on the left pointer | |
| while(lf != rt ){ | |
| console.log(">> " + a.join() + "=> pointers: left@" + lf + " right@" + rt ); | |
| if( a[lf] > a[rt] ){ | |
| lf_pivot = !lf_pivot; | |
| //swap | |
| var tmp = a[lf]; | |
| a[lf] = a[rt]; | |
| a[rt] = tmp; | |
| lf_pivot ? rt-- : lf++; | |
| }else{ | |
| lf_pivot ? rt-- : lf++; | |
| } | |
| } | |
| console.log(">> " + a.join() + "=> pointers collision @ " + rt ); | |
| if(a.length == 2) { | |
| return a; | |
| }else{ | |
| return [].concat( quicksort(a.slice(0,rt)), | |
| a[rt], | |
| quicksort( a.slice(rt+1) ) //out of bound index will return an empty array | |
| ); | |
| } | |
| } | |
| console.log( "output: " + quicksort([4,8,1,6,3,7,2,5]) ); | |
| /** | |
| call: 4,8,1,6,3,7,2,5 | |
| >> 4,8,1,6,3,7,2,5=> pointers: left@0 right@7 quicksort.js:18 | |
| >> 4,8,1,6,3,7,2,5=> pointers: left@0 right@6 quicksort.js:18 | |
| >> 2,8,1,6,3,7,4,5=> pointers: left@1 right@6 quicksort.js:18 | |
| >> 2,4,1,6,3,7,8,5=> pointers: left@1 right@5 quicksort.js:18 | |
| >> 2,4,1,6,3,7,8,5=> pointers: left@1 right@4 quicksort.js:18 | |
| >> 2,3,1,6,4,7,8,5=> pointers: left@2 right@4 quicksort.js:18 | |
| >> 2,3,1,6,4,7,8,5=> pointers: left@3 right@4 quicksort.js:18 | |
| >> 2,3,1,4,6,7,8,5=> pointers collision @ 3 quicksort.js:32 | |
| call: 2,3,1 quicksort.js:11 | |
| >> 2,3,1=> pointers: left@0 right@2 quicksort.js:18 | |
| >> 1,3,2=> pointers: left@1 right@2 quicksort.js:18 | |
| >> 1,2,3=> pointers collision @ 1 quicksort.js:32 | |
| call: 6,7,8,5 quicksort.js:11 | |
| >> 6,7,8,5=> pointers: left@0 right@3 quicksort.js:18 | |
| >> 5,7,8,6=> pointers: left@1 right@3 quicksort.js:18 | |
| >> 5,6,8,7=> pointers: left@1 right@2 quicksort.js:18 | |
| >> 5,6,8,7=> pointers collision @ 1 quicksort.js:32 | |
| call: 8,7 quicksort.js:11 | |
| >> 8,7=> pointers: left@0 right@1 quicksort.js:18 | |
| >> 7,8=> pointers collision @ 1 quicksort.js:32 | |
| output: 1,2,3,4,5,6,7,8 | |
| **/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment