算法基礎之徹底理解冒泡排序及其深度優化

冒泡排序

冒泡排序,作爲最基礎的算法之一,屬於選擇算法中的一種簡單比較算法。其複雜度在最簡單情況下爲O(n), 最複雜情況下爲O(n2),也常作爲面試必考算法。本篇主要通過Javascript來實現冒泡排序以及其優化過程。
1、冒泡排序
	function popoSort(arr=[]){
		if(arr.length <= 0) {
			return arr;
		}
		const len = arr.length;
		for(let i = 0; i < len; i++){
			for(let j=i+1;j < len; j++){
			    // 如果前面的元素比後面的大,則交換元素,最終結果就是
				if(arr[j] > arr[i]){
					let temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}
		}
		return arr;
	}
2、第一層優化

在上述算法中,如果在一次遍歷中,發現元素沒有進行交換了,那說明數組已然有序,這時候就無須做多餘比較了。用一個標記去標記上一次遍歷是否發生過交換,如果沒有,那說明數組已經有序,則無需再遍歷。

	function popoSort(arr=[]){
		if(arr.length <= 0) {
			return arr;
		}
		const len = arr.length;
		for(let i = 0; i < len; i++){
			let flag = 0;
			for(let j=i+1;j < len; j++){
			    // 如果前面的元素比後面的大,則交換元素,最終結果就是
				if(arr[j] > arr[i]){
					let temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					flag = 1;
				}
			}
			if(flag === 0) {
				return arr;
			}
		}
		return arr;
	}
3、第二層優化

在第一次優化中,只是增加了數組有序條件的判定。其實在數組還未完全有序時,因爲已經部分有序了,有些多餘的比較也可省略,這裏可以用一個temPosition記錄上一次遍歷交換的最後一個元素的索引。下次比較只需要到這次索引終止即可。

	function popoSort(arr=[]){
		if(arr.length <= 0) {
			return arr;
		}
		let len = arr.length ;
		let temPosition = 0;
		for(let i = 0; i < arr.length; i++){
			let flag = 0;
			for(let j=i+1;j < len; j++){
			    // 如果前面的元素比後面的大,則交換元素,最終結果就是
				if(arr[j] > arr[i]){
					let temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					flag = 1;
					// 記錄上一次遍歷的位置
					temPosition = j;
				}
			}
			//len = temPosition;
			if(flag === 0) {
				return arr;
			}
		}
		return arr;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章