1. 程式人生 > >PHP常見的幾種排序算法

PHP常見的幾種排序算法

php 算法 排序 冒泡排序

一、冒泡排序

排序原理:對一組數據,比較相鄰數據的大小,把小的數據放在前面,值大的放在後面(升序排序)

舉例說明: $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個數也是排好順序的。如此反復循環,直到全部排好順序

代碼實現:

技術分享圖片


四、快速排序

從數組第一個元素開始依次確定從小到大的元素

代碼實現:

技術分享圖片


PHP常見的幾種排序算法