js實現兩種實用的排序演算法——冒泡、快速排序

52.0Hz發表於2016-11-01

零:資料準備,給定陣列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實現:

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));
4效率:陣列長度10,排序次數22次。

三:總結

兩種方法各有優缺點,但是這兩種方法作為程式設計師必須掌握,因為一種是最基礎的,另一種是最常用的,面試或者日常都會碰到。

相關文章