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   

第三次比較 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個數也是排好順序的。如此反覆循環,直到全部排好順序

  代碼實現:

    


四、快速排序 

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

    代碼實現:

    

    

發佈了44 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章