一、冒泡排序
排序原理:對一組數據,比較相鄰數據的大小,把小的數據放在前面,值大的放在後面(升序排序)
舉例說明: $arr = [6, 3, 8, 2, 9, 1];
第一輪排序:
第一次比較 6和3比較: 3 6 8 2 9 1
第二次比較 6和8比較: 3 6 8 2 9 1
第三次比較 8和2比較: 3 6 2 8 9 1
第四次比較 8和9比較: 3 6 2 8 9 1
第五次比較 9和1比較: 3 6 2 8 1 9
第一輪比較總結:1.排序第1輪、比較5次,沒有獲得從小到大的排序 2.因爲每次比較都是大數往後靠,所以比較完成後,可以確定大數排在最後(9 已經冒泡冒出來了,下輪比較可以不用比較了 )
第二輪排序:
第一次比較 3和6比較: 3 6 8 2 1 9
第二次比較 6和8比較: 3 6 8 2 1 9
第三次比較 8和2比較: 3 6 2 8 1 9
第四次比較 8和1比較: 3 6 2 1 8 9
第二輪比較總結:1.排序第2輪、比較4次,沒有獲得從小到大的排序 2.冒泡出了 8,下輪不用比較8 了
第三輪排序:
第一次比較 3和6比較: 3 6 2 1 8 9
第二次比較 6和2比較: 3 2 6 1 8 9
第三次比較 6和1比較: 3 2 1 6 8 9
第三輪比較總結:1.排序第3輪、比較3次,沒有獲得從小到大的排序 2.冒泡出了 6,下輪不用比較6 了
第四輪排序:
第一次比較 3和2比較: 2 3 1 6 8 9
第二次比較 3和1比較: 2 1 3 6 8 9
第四輪比較總結:1.排序第4輪、比較2次,沒有獲得從小到大的排序 2.冒泡出了 3,下輪不用比較3 了
第五輪比較
第一次比較2和1比較: 1 2 3 6 8 9
第五輪比較總結:1.排序第5輪、比較1次,沒有獲得從小到大的排序 2.冒泡出了 2,由於還剩一個1,不用再比較了,至此通過5輪排序,完成整個排序
結論:對於一個長度爲N的數組,我們需要排序 N-1 輪,每 i 輪 要比較 N-i 次。對此我們可以用雙重循環語句,外層循環控制循環輪次,內層循環控制每輪的比較次數。
代碼實現:
二、選擇排序
原理:在一組數據中,選出最小數與第一個位置的數交換。讓胡在剩些的數再找最小的數與第二個位置的數交換,如此類推。
舉例說明: $arr = [6, 3, 8, 2, 9, 1];
第一輪:
第一次比較: 第一個數6與3 8 2 9 1中的3比較,最小數爲3,位置爲1
第二次比較: 第最小數3與3 8 2 9 1中的8比較,最小數爲3,位置爲1
第三次比較: 第最小數3與3 8 2 9 1中的2比較,最小數爲2,位置爲3
第四次比較: 第最小數2與3 8 2 9 1中的9比較,最小數爲2,位置爲3
第五次比較: 第最小數2與3 8 2 9 1中的1比較,最小數爲1,位置爲5
第一輪比較完成後,確定最小數爲1,小於第一個數6,交換位置上的數,交換後結果爲 1 3 8 2 9 6
第二輪:
第一次比較: 第一個數3與 8 2 9 6中的8比較,最小數爲3,位置爲1
第二次比較: 第最小數3與 8 2 9 6中的2比較,最小數爲2,位置爲3
第三次比較: 第最小數2與 8 2 9 6中的9比較,最小數爲2,位置爲3
第三次比較: 第最小數2與 8 2 9 6中的6比較,最小數爲2,位置爲3
第二輪比較完成後,確定最小數爲2,小於第二個數3,交換位置上的數,交換後結果爲 1 2 8 3 9 6
第三輪:
第一次比較: 第一個數8與 3 9 6中的8比較,最小數爲3,位置爲3
第二次比較: 第最小數3與 3 9 6中的9比較,最小數爲3,位置爲3
第三次比較: 第最小數2與 3 9 6中的6比較,最小數爲3,位置爲3
第三輪比較完成後,確定最小數爲3,小於第三個數8,交換位置上的數,交換後結果爲 1 2 3 8 9 6
第四輪:
第一次比較: 第一個數8與 9 6中的9比較,最小數爲8,位置爲3
第二次比較: 第最小數8與 9 6中的6比較,最小數爲6,位置爲5
第四輪比較完成後,確定最小數爲6,小於第四個數8交換位置上的數,交換後結果爲 1 2 3 6 9 8
第五輪:
第一次比較: 第一個數9與 8 中的8比較,最小數爲8,位置爲5
第五輪比較完成後,確定最小數爲8,小於第五個數9,交換位置上的數,交換後結果爲 1 2 3 6 8 9
綜合以上五輪比較,每一輪比較都可以確定一個位置,對於N個數,比較N-1輪可以確定N個位置上的數,因爲確定了N-1個位置,最後一個位置也就確定了
代碼實現:
三、插入排序
在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆循環,直到全部排好順序
代碼實現:
四、快速排序
從數組第一個元素開始依次確定從小到大的元素
代碼實現: