冒泡排序 冒泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。 冒泡排序演算法的運作如下:(從後往前) l 依次比較相鄰的兩個元素,消除逆序(逆序是數學上的概念,是成對出現的,比如50,30就是一對逆序,所謂的消除逆序,就是大的放後面,小的放前面) l 這樣,一輪比較下來,最大 ...
冒泡排序
冒泡排序(Bubble Sort),是一種電腦科學領域的較簡單的排序演算法。
冒泡排序演算法的運作如下:(從後往前)
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重覆以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重覆上面的步驟,直到沒有任何一對數字需要比較。
l 依次比較相鄰的兩個元素,消除逆序(逆序是數學上的概念,是成對出現的,比如50,30就是一對逆序,所謂的消除逆序,就是大的放後面,小的放前面)
l 這樣,一輪比較下來,最大的那個數一對是在最後面!
l 然後,再繼續新的一輪的比較,註意,剛纔一輪後的最大值不再參與比較,這樣,這一輪參與比較的數值就比上一輪少一個,如此反覆,直到最後只剩下兩個數值比較為止!
所以是一個雙重迴圈,外層控制輪數,內層控制每輪比較的次數。
如果數組有n個元素,一共需要比較n-1輪,也就是外迴圈的次數!
補充一個其他知識點:
list — 把數組中的值賦給一些變數 ,從小到大,反過來賦值從大到小
下麵說一下我寫的冒泡排序,以及註釋我自己對它的理解:
//冒泡排序,讓數組從小到大依次排序 function maopao($arr){ //雙層迴圈,外層控制,$i代表迴圈的輪數,比較輪數等於數組的個數減1,$i<$len相當於數組個數-1,例如8個,當$i=7是最後的比較,符合8-1=7; for($i=1,$len=count($arr);$i<$len;$i++){ //內層控制每一輪比較的次數,$k=下標,每一輪比較完最後一個將不再參與比較,下標從0開始 for($k=0;$k<$len-$i;$k++){ //比較相鄰的兩個數,如果前面的數值比後面的大就調換下位置,通過中間數,如果不比它大,則不用調換 if($arr[$k]>$arr[$k+1]){ //調換位置 $tem=$arr[$k]; $arr[$k]=$arr[$k+1]; $arr[$k+1]=$tem; } } } return $arr; } $arr1=array(45,85,12,22,36,7,75,15,40,64); // echo count($arr1); echo '<pre>'; print_r(maopao($arr1));
效果:實現了數組從小到大的排序
如果要實現從大到小,也是一樣的演算法,都是通過中間數的比較進行交換。
接下來說一說我在面試遇到的一個問題:取一個數組,讓這個數組按第一個最大,第二個最小,第三個第二大,第四個第二小…這樣進行排序。
當時我只想到好像有個
array_pop:將數組的最後一個數據彈出
array_shift:從數組的前面彈出數據
那讓數組從大到小排序後,彈出第一個就拿到最大的,彈出最後一個就拿到最小的,把這兩個放一起就一個最大一個最小,再繼續進行這樣的取出,直到取完所有。
最讓我開心,欣慰的是面我的技術老大肯定了我的邏輯是可以的,高興了好幾天….
回去我就去嘗試我這個可不可行,下麵我就說下我自己試的這個方法
舉例:
所以第一步:我是先讓數組進行通過冒泡進行從大到小的排序
第二步,我是通過遞歸把彈出來的第一個(最大)和最後一個(最小)放一起,再進行取出,直到取完為止。
效果:
這個有更好的方法,我這裡說的是我當時剛好想到的那個方法,哈,莫見怪,望吐槽。