天天看點

非常經典的冒泡排序

非常經典的冒泡排序

//定義要進行排序的數組
let arr = [11,5,13,17,20]
//使用for循環進行比較
for(let i = 0; i < arr.length; i++){
	//設定for循環的跳出條件;不明白為什麼要加這個值的可以結合下邊的判斷了解
	let boolean = true
	//内層循環 arr.length - i 的原因是每比較一輪就少比較一次,節省循環次數,進而優化
	for(let j = 0; j < arr.length - i; j++){
		/*
			判斷前一個值是否小于後一個值,如果小于則說明,後一個值比前一個值大,此時滿足條件,進入位置交換;
			如果小向大排序的話,隻需要将此處的小于号改為大于号即可實作
		*/
		if(arr[j] < arr[j+1]){
		//交換位置方法1:
			//定義一個第三方變量 t 并指派 前一個數值
			let t = arr[j]
			// 将後一個數值 指派給 前一個,交換位置
			arr[j] = arr[j+1]
			//将arr[j]給到t的值 指派給 後一個 完成位置交換
			arr[j+1] = t
		
		//交換位置方法2:
			// 将兩個值的和指派給前一個
			arr[j] = arr[j] + arr[j+1]
			// 用兩個值的和 減去 後一個的值 指派給後一個,此時後一個的值就是前一個的值
			arr[j+1] = arr[j] - arr[j+1]
			//用兩個值得和 減去 前一個得值 指派給前一個;此時 前一個就是後一個得值
			arr[j] = arr[j] - arr[j+1]
			/**
				例如: arr[j] = 1; arr[j+1] = 2
				1 + 2 = 3
				此時 arr[j] = 3
				3 - 2 = 1
				此時 arr[j+1] = 1
				3 - 1 = 2
				此時arr[j] = 2
				位置也就交換完成了
			*/
			//本次有交換位置,進入下一次的循環
			boolean = false
		}
	}
	//如果boolean值為true,則說明内層循環沒執行,即:所有排序已經完成,沒有必要再進行循環了
	if(boolean)break
}
           

繼續閱讀