1. 程式人生 > 其它 >氣泡排序的實現,複雜度以及改進

氣泡排序的實現,複雜度以及改進

時間複雜度: O(n^2)

一般的冒泡:

function bubbleSort1(arr) {
	for (let i = 0; i < arr.length - 1; i++) {
		for (let j = 0; j < arr.length - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
			}
		}
	}
}

這個存在的問題是,每次迴圈一次,後面就會多一段有序的陣列,然而每次還是遍歷了,是多餘了

優化一下這個問題

function bubbleSort2(arr) {
	// i是j需要遍歷的次數,並不用i來遍歷內容。
	// 這樣,每次會把上一次排過的陣列濾過,只排列前面還沒有排列的部分
	// 每一次j就可以少遍歷一次
	for (let i = arr.length-1; i >= 0; i--) {	
		for (let j = 0; j < i; j++) {
			if (arr[j] > arr[j + 1]) {
				[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
			}
		}
	}
}

對於這個方案,還可以改進
如果剩下的還沒有排序的部分,本身就是有序的,也可以讓遍歷跳過,就又可以省下不少時間
例如這種: let a = [1, 2, 3, 4, 5, 6, 3, 11, 12, 9, 5, 8, 7, 23, 6, 8, 9];

function bubbleSort3(arr) {
	var swapedFlag;
	for (var i = arr.length - 1; i >= 0; i--) {
		swapedFlag = false;
		for (var j = 0; j < i; j++) {
			if (arr[j] > arr[j + 1]) {
				swapedFlag = true;
				[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
			}
		}
		// 如果j遍歷,從頭到尾都沒有把swapedFlag置為true,就證明剩下的一段陣列,本來就是按順序的,就不用再遍歷了
		if (!swapedFlag) {
			break;
		}
	}
}