php中常見的排序算法有哪些?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)公司提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計,成都品牌網(wǎng)站建設(shè),1元廣告等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,十余年的網(wǎng)站開發(fā)和建站經(jīng)驗,助力企業(yè)信息化建設(shè),成功案例突破上千多家,是您實現(xiàn)網(wǎng)站建設(shè)的好選擇.一、插入排序
用文字簡單的描述,比如說$arr = array(4,2,4,6,3,6,1,7,9); 這樣的一組數(shù)字進行順序排序:
那么,首先,拿數(shù)組的第二個元素和第一元素比較,假如第一個元素大于第二元素,那么就讓兩者位置互換,接下來,拿數(shù)組的第三個元素,分別和第二個,第一個元素比較,假如第三個元素小,那么就互換。依次類推。這就是插入排序,它的時間頻度是:1+2+...+(n-1)=(n^2)/2。則它的時間復(fù)雜度為O(n^2).
php實現(xiàn)代碼如下:
=0&&$arr[$j]<$arr[$i]){ $arr[$i] = $arr[$j]; $arr[$j] = $tmp; $j--; } } return $arr; } ?>
二、選擇排序
選擇排序用語言描述的話,可以這樣,如:$arr = array(4,3,5,2,1);
首先,拿第一個和后面所有的比,找出最小的那個數(shù)字,然后和第一個數(shù)組互換(當(dāng)然,如果是第一個最小,那么就不用互換了),接著循環(huán),即:拿第二個和后面的比較,找出最小的數(shù)字,然后和第二個數(shù)字互換,依次類推,也就是說每次都是找出剩余最小的值。 可得到:第一次,時間頻度 是n, (第一個和后面的n-1個比較,找到最小的,再看是不是第一個,不是第一個的話進行互換) 在往后,依次是 減一 。 它的時間復(fù)雜度,也是O(n^2);
php實現(xiàn)代碼如下:
$arr[$j]){ $min = $j; //找到最小的那個元素的下標(biāo) } } if($min!=$i){//如果下標(biāo)不是$i 則互換。 $tmp= $arr[$i]; $arr[$i] = $arr[$min]; $arr[$min] = $tmp; } } return $arr; } ?>
三、冒泡排序
冒泡排序其實上是和選擇排序相比,并無明顯差別。都是找到最小的,放到最左端。依次循環(huán)解決問題。差別在于冒泡排序的交換位置的次數(shù)較多,而選擇排序則是找到最小的元素的下標(biāo),然后直接和最左端的交換位置。
php實現(xiàn)代碼如下:
$arr[$j]){ $tmp= $arr[$i]; $arr[$i] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; } ?>
四、快速排序
快速排序,用語言來形容的話,從數(shù)組中選擇一個值$a,然后和其余元素進行比較,比$a大的放到數(shù)組right中,反之,放到數(shù)組left中。然后將left right 分別進行遞歸調(diào)用,即:再細(xì)分left right ,最后進行數(shù)組的合并。
php實現(xiàn)快速排序:
=$arr[$i]){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } $left = mySort($left); $right = mySort($right); $result = array_merge($left,$right); return $result; } ?>
五、歸并排序
其實歸并排序是一種拆分,合并的思想。和快速排序思想有共通之處,左邊一堆,右邊一堆,然后進行合并。通過遞歸實現(xiàn)排序。 區(qū)別之處呢? 他們的區(qū)別也是思想上本質(zhì)的區(qū)別,快速排序的拆分,是選擇了特定的值進行大小比較,從而分為left 和 right 。也就是小的一堆放入left,大的一堆放入right。而后,小的left 再細(xì)分為left1 right1。。。。通過進行類似的遞歸完成排序。也就是說,一直細(xì)分下去,遞歸最末尾的left1就是最小值。
而歸并排序,是從幾何上的左右切分,一直遞歸切分成2或者1的最小粒度的數(shù)組,然后才開始進行比較大小,然后合并。此處的比較大小是:兒子left的元素 和兒子的right元素 進行比較,而后進行排序合并成為父親left或者right。在此,直到拿到各自排序合并完成最后兩個數(shù)組:最起初的left 和right,也僅僅直到他們各自的順序,并不能確認(rèn)整個數(shù)組的順序,還是需要通過最終的left right 比較后合并才能完成真正意義上的排序。
$right[0] ? array_shift($right) : array_shift($left); //進行比較,小的移除,并且放入到數(shù)組$m中。 } return arr_merge($m,$left,$right);//進行合并(由于不知道left right 哪個會為空,所以進行統(tǒng)一合并) } ?>
六、堆排序
本例中fixDown函數(shù)實現(xiàn)對某一個節(jié)點的向下調(diào)整,這里默認(rèn)的是起始節(jié)點為1,方便計算父子節(jié)點關(guān)系
注:
起始節(jié)點為1的父子關(guān)系: 父節(jié)點k, 子節(jié)點為2K、2k+1 子節(jié)點j, 父節(jié)點為 floor(j/2) floor為向下取整
起始節(jié)點為0的父子關(guān)系: 父節(jié)點k, 子節(jié)點為2K+1, 2k+2 子節(jié)點j, 父節(jié)點為 floor((j-1)/2)
參數(shù)$k為調(diào)整點位置, $lenth為數(shù)組長度,也就是從1起始到最后一個節(jié)點的坐標(biāo).
=1;$i--) { fixDown($arr, $i, $len); } while($len>1) { exch($arr[1], $arr[$len]); fixDown($arr, 1, --$len); } array_shift($arr); } $arr = array(4,6,4,9,2,3); headSort($arr); ?>
看完上述內(nèi)容,你們掌握php中常見的排序算法有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!