js實現兩種實用的排序演算法——冒泡、快速排序
阿新 • • 發佈:2019-01-06
零:資料準備,給定陣列arr=[2,5,4,1,7,3,8,6,9,0];
一:冒牌排序
1思想:氣泡排序思想:每一次對比相鄰兩個資料的大小,小的排在前面,如果前面的資料比後面的大就交換這兩個數的位置
要實現上述規則需要用到兩層for迴圈,外層從第一個數到倒數第二個數,內層從外層的後面一個數到最後一個數
2特點:排序演算法的基礎。簡單實用易於理解,缺點是比較次數多,效率較低。
3實現:
var times=0; var bubbleSort=function(arr){ for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){//如果前面的資料比後面的大就交換 var temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } console.log("第"+(++times)+"次排序後:"+arr); } } return arr; } console.log("The result is:"+bubbleSort(arr));
4效率:陣列長度10,排序次數45次。
二:快速排序
1思想:快速排序思想:先找到一個基準點(一般指陣列的中部),然後陣列被該基準點分為兩部分,依次與該基準點資料比較,如果比它小,放左邊;反之,放右邊。
左右分別用一個空陣列去儲存比較後的資料。最後遞迴執行上述操作,直到陣列長度<=1;
2特點:快速,常用。缺點是需要另外宣告兩個陣列,浪費了記憶體空間資源。
3實現:
4效率:陣列長度10,排序次數22次。var times=0; var quickSort=function(arr){ //如果陣列長度小於等於1無需判斷直接返回即可 if(arr.length<=1){ return arr; } var midIndex=Math.floor(arr.length/2);//取基準點 var midIndexVal=arr.splice(midIndex,1);//取基準點的值,splice(index,1)函式可以返回陣列中被刪除的那個數arr[index+1] var left=[];//存放比基準點小的陣列 var right=[];//存放比基準點大的陣列 //遍歷陣列,進行判斷分配 for(var i=0;i<arr.length;i++){ if(arr[i]<midIndexVal){ left.push(arr[i]);//比基準點小的放在左邊陣列 } else{ right.push(arr[i]);//比基準點大的放在右邊陣列 } console.log("第"+(++times)+"次排序後:"+arr); } //遞迴執行以上操作,對左右兩個陣列進行操作,直到陣列長度為<=1; return quickSort(left).concat(midIndexVal,quickSort(right)); }; console.log(quickSort(arr));
三:總結
兩種方法各有優缺點,但是這兩種方法作為程式設計師必須掌握,因為一種是最基礎的,另一種是最常用的,面試或者日常都會碰到。