1. 程式人生 > >js實現氣泡排序和快速排序

js實現氣泡排序和快速排序

氣泡排序

  1. 1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 3.針對所有的元素重複以上的步驟,除了最後一個。
  4. 4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

用到兩層for迴圈

function bubbleSort(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;
				}
				
			}
		}
		return arr;

	}
	alert(bubbleSort([20,4,39,45,12]));
快速排序

1、找基準點(一般是以中間項為基準)

2、遍歷陣列,小於基準的放在left,大於基準的放在right

3、遞迴

//把要排序的陣列作為引數傳進去
	function quickSort(arr){
		if(arr.length<=1){
			return arr;
		}//遞迴演算法的終結,一定要指定這個,不然會進入死迴圈
		var times=0;

		var num=Math.floor(arr.length/2);//選擇一個元素作為"基準",即陣列中間的那個元素
		var numValue=arr.splice(num,1);
		//返回的是基準點的值,注意:這個方法已經把原先陣列中的這個基準點給刪掉了,最後要重新拼接到一起

		//建立兩個陣列,分別來存放基準點兩邊的元素
		var left=[]; //左邊
		var right=[];//右邊

		
		for(var i=0;i<arr.length;i++){
			if(arr[i]<numValue){
				left.push(arr[i]);//比基準點小的放在左邊
			}else{
				right.push(arr[i]);//比基準點大的放在左邊
			}
			

		}
		
         //遞迴操作,將左陣列,基準點,右陣列拼接到一起
         /*arguments.callee代表的是quickSort這個函式
         arguments包含函式內的所有引數
         callee屬性是一個指標,指向擁有這個arguments物件的函式
         這樣做可以消除函式名與這個函式之間的耦合性,即使這個演算法換一個名字
         也不會對函式的執行造成影響
         */
		return arguments.callee(left).concat([numValue],arguments.callee(right));
		


	}
	alert(quickSort([20,4,39,45,12]));