1. 程式人生 > >氣泡排序再理解

氣泡排序再理解

今天重新學習這個人人皆知的演算法-----氣泡排序

氣泡排序
1、從頭依次訪問陣列每個元素,進行相鄰元素之間的交換
2、元素之間兩兩交換,把小的換到前面,大的放到後面。
3、所有元素交換完成後,一趟交換完成,此時最大的元素會到陣列尾部。
4、反覆執行以上步驟,直到所有元素都排序完。

  這個冒泡演算法基本大家都學過,本人愚笨一直也沒有深入理解這個演算法,往往都是記住大概的程式碼樣子,導致過了很久完全不記得氣泡排序是怎麼回事。這次本著搞清楚它的目標來重新學習它,為什麼是這樣,而不是這樣。

演算法:

function bubbleSort(nums){
	//陣列長度
	var n = nums.
length; //外層控制跑的趟數 for(var i=0;i<n-1;i++){ //這層控制交換的次數 for(var j=0;j<n-i-1;j++){ //如果前面大於後面的,就交換過來,把最大的換到最後面 if(nums[j]>nums[j+1]){ //相鄰交換 var temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; } } } return nums; }

冒泡原理:
 以前理解:只記得是2個數字交換,再按一定的順序排好。
 現在理解:通過一趟又一趟的元素交換排序,達成最終的排序,也就是說一趟排序可以排好一個元素到最後,每一趟下來,需要排序的元素都會少一個。

疑惑探究:
 疑惑1:一直沒有搞清楚雙迴圈的目的,只知道要雙迴圈。
 探究1:冒泡演算法通過雙迴圈來控制跑的趟數和每趟需要比較的元素,即外層迴圈控制跑的趟數,內層迴圈控制需要比較的元素個數。

 疑惑2:外層迴圈,內層迴圈的迴圈條件如何理解?
 探究2:明白了每層迴圈的目的之後,就能更好理解每層迴圈的迴圈條件了。外層迴圈既然是控制迴圈的趟數,一趟最壞的情況是排好一個元素,所以n個元素需要n趟,因為剩最後一個元素時,整個陣列已經排序好,所以最後需要n-1趟。迴圈條件就是:

	for(var i=0;i<n-1;i++){}

 疑惑3:交換方式真的理解了嘛?

	if(nums[j]>
nums[j+1]){ var temp = nums[j]; nums[j] = nums[j+1]; nums[j+1] = temp; }

 探究3:以前只認為是簡單2個數交換,並沒有把它放在整個迴圈中考慮。在內層迴圈中跑完一趟之後,無論是換大的還是小的。按照內層迴圈條件來寫的話,都是把最大或者最小的元素慢慢移到最後去,而不是移到最開始。之前我一直想錯,以為是換到前面。

 誤區3:之前我一直沒有想清楚冒泡的整個過程,導致我經常習慣寫出下面這樣的迴圈,想法很好交換一趟,最開頭的元素固定,自然就從第二個元素開始繼續交換,實際卻不知道這樣交換的結果是每次尾部的元素的固定,前面許多元素沒有排序好的也不會在排序,最後的結果當然也不會正確。錯誤程式碼:

	for(var i=0;i<n-1;i++){
		for(var j=i;j<n-1;j++){
			if(nums[j]<nums[j+1]){
				var temp = nums[j];
				nums[j] = nums[j+1];
				nums[j+1] = temp;
			}
		}
	}

  重新理解了一遍冒泡演算法,收穫良多,再去溫習幾遍。每一次重新梳理知識點,發現自己以前認識的是錯誤的,就要好好學習了,不能誤人子弟啊!