幾大排序思想(由javascript編寫)
阿新 • • 發佈:2017-06-04
quick 交換 ice 最大數 splay 分享 javascrip text emp
Hello!我是super喵二~~~今天練了幾道面試題,突然覺得好久沒有好好歸納 過排序算法了。以前都是用C/java編寫排序,這次用js來總結下五大排序算法吧:
1、冒泡排序(常用及常考排序算法):
不用多說,冒泡就是一個一個浮上去~~~也就是說需要一個一個比較:
<script type="text/javascript"> //冒泡排序,一次一次的相鄰兩個數比,直到把最大數找出來 var array = [5,2,4,6,8]; var temp; function sort(array){ for(var i=0;i<array.length-1;i++){Bubblefor(var j=0;j<array.length-i-1;j++){ if(array[j]>array[j+1]){ temp=array[j+1]; array[j+1]=array[j]; array[j]=temp; } } } console.log(array); } sort(array)// [2,4,5,6,8] </script>
2、插入排序:
插入插入,當然需要插在該插的位置啦。簡單理解就是每循環到一個數,就把它前面的數當做一個數組,然後插在數組裏該插的位置:
<script type="text/javascript"> var array = [5,2,4,6,8]; var temp; //插入排序是從第一個數開始,把第一個當成數組,第二個數與它比較,插入。再將前兩個看成數組,第三個來比較插入該插的位置,依次類推 function sort(array){Insertfor(var i=0;i<array.length;i++){ for(var j=0;j<i+1;j++){ if(array[i]<array[j]){ temp=array[i]; array[i]=array[j]; array[j]=temp; } } } console.log(array); } sort(array) // [2,4,5,6,8] </script>
3、選擇排序:
一次一次選擇出小的數(按升序來的話),首先認為第一個數最小,就依次比較它後面的數,有更小的就記錄位置,將這個更小的記錄之後,如果後面還有數,就以這個更小數為基準,再繼續找,如果有比更小還小的,就記錄位置,然後繼續找,直到找到最小的然後和第一個數交換。接下來就從數組中的第二個數開始,依次~~~~
<script type="text/javascript"> var array = [5,2,4,6,8]; var temp; //選擇排序,從第一個數開始比較,遇到小與它的記錄位置,再將這個數與它後面的數比較,如果沒有就交換這兩個數,如果有,則繼續比較。 function sort(array){ for(var i=0;i<array.length-1;i++){ var index=i; for(var j=i+1;j<array.length;j++){ if(array[index]>array[j]){ index=j; } } temp=array[i]; array[i]=array[index]; array[index]=temp } console.log(array); } sort(array) // [2,4,5,6,8] </script>Select
4、快速排序:
快速排序,眾所周知,速度最快,很多公司面試都會考這個,手寫的話還是有點難。大家可以主要掌握下C語言版本,用其他語言寫就很容易了。。。我是參照阮一峰老師寫的,主要是找一個基準元素,比基準元素小的在左邊,比基準元素大的在右邊,然後左右看成兩個數組,分別找各自的基準元素再分組~~~直到最後~~
<script type="text/javascript"> var array = [5,2,4,6,8]; var temp; //快速排序:先找一個基準元素,比它小的放在左邊數組,大的放在右邊數組,然後又分別在左邊和右邊數組中找出基準元素進行比較 var quicksort=function(array){ if (array.length<=1) { return array; }else{ var priotIndex=Math.floor(array.length/2); var priot=array.splice(priotIndex,1)[0]; var left=[]; var right=[]; for (var i = 0; i < array.length; i++) { if (array[i]<priot) { left.push(array[i]); } else { right.push(array[i]); } } return quicksort(left).concat([priot],quicksort(right)); } } console.log(quicksort(array)); </script>Quick
5、合並排序:
合並排序類似快排,主要也是才用遞歸,分組比再合,具體實現如下:
//歸並排序:從兩個兩個比較,然後四個一組比較,然後8個一組比較 var array = [5,2,4,6,8]; var merge=function(left,right){ var arr=[]; while(left.length>0&&right.length>0){ if (left[0]<right[0]) { arr.push(left.shift()); }else{ arr.push(right.shift()); } } return arr.concat(left,right); } var mergeSort=function(array){ if (array.length==1) { return array; }else if (array.length>1) { var middle=Math.floor(array.length/2), left=array.slice(0,middle), right=array.slice(middle); return merge(mergeSort(left),mergeSort(right)); } } console.log(mergeSort(array));Merge
暫時就這五個,排序算法還有很多種,堆排序,隨機快排。。。。這就自行了解吧,還有比較每個算法的時間復雜度,空間復雜度來決定誰更好,視情況而定吧~~
幾大排序思想(由javascript編寫)