PHP版本常用的排序算法匯總
更新時(shí)間:2015年12月20日 11:46:25 投稿:hebedich
本文給大家匯總介紹了一些php中常見(jiàn)的排序算法的代碼,非常實(shí)用,有需要的小伙伴可以參考下。
//1、冒泡排序
function bubble_sort($arr){
$n = count($arr);
for($i=0;$i<$n-1;$i++){
for($j=$i+1;;$j<$n-$i;$j++){
if($arr[$j]<$arr[$i]){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
}
//2、歸并排序
//merge函數(shù)將指定的兩個(gè)有序數(shù)組(arr1arr2,)合并并且排序
//我們可以找到第三個(gè)數(shù)組,然后依次從兩個(gè)數(shù)組的開(kāi)始取數(shù)據(jù)哪個(gè)數(shù)據(jù)小就先取哪個(gè)的,然后刪除掉剛剛?cè)∵^(guò)///的數(shù)據(jù)
function al_merge($arrA, $arrB)
{
$arrC = array();
while (count($arrA) && count($arrB)) {
//這里不斷的判斷哪個(gè)值小,就將小的值給到arrC,但是到最后肯定要剩下幾個(gè)值,
//不是剩下arrA里面的就是剩下arrB里面的而且這幾個(gè)有序的值,肯定比arrC里面所有的值都大所以使用
$arrC[] = $arrA['0'] < $arrB['0'] ? array_shift($arrA) : array_shift($arrB);
}
return array_merge($arrC, $arrA, $arrB);
}
//歸并排序主程序
function al_merge_sort($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr; //遞歸結(jié)束條件,到達(dá)這步的時(shí)候,數(shù)組就只剩下一個(gè)元素了,也就是分離了數(shù)組
}
$mid = intval($len / 2); //取數(shù)組中間
$left_arr = array_slice($arr, 0, $mid); //拆分?jǐn)?shù)組0-mid這部分給左邊left_arr
$right_arr = array_slice($arr, $mid); //拆分?jǐn)?shù)組mid-末尾這部分給右邊right_arr
$left_arr = al_merge_sort($left_arr); //左邊拆分完后開(kāi)始遞歸合并往上走
$right_arr = al_merge_sort($right_arr); //右邊拆分完畢開(kāi)始遞歸往上走
$arr = al_merge($left_arr, $right_arr); //合并兩個(gè)數(shù)組,繼續(xù)遞歸
return $arr;
}
$arr = array(12, 5, 4, 7, 8, 3, 4, 2, 6, 4, 9);
print_r(al_merge_sort($arr));
//3、二分查找-遞歸
//二分查找-遞歸
function bin_search($array,$low,$high,$k){
if($low <= $high){
$mid = intval(($low+$high)/2);
}else{
return false;
}
if($array[$mid] == $k){
return $mid;
}elseif($k < $array[$mid]){
return bin_search($array,$low,$mid-1,$k);
}else{
return bin_search($array,$mid+1,$high,$k);
}
}
$arr = array(12, 5, 4, 7, 3, 8, 4, 2, 6, 4, 9);
$index = bin_search($arr,0,10,12); //直接輸出為空,不解
echo(intval($index));
//4、二分查找-非遞歸
function bin_search($arr,$low,$high,$value) {//$arr 數(shù)組; $slow 最小索引; $high 最大索引 $value 查找的值
while($low<=$high) {
$mid=intval(($low+$high)/2);
if($value==$arr[$mid]){
return $mid;
}elseif($value<$arr[$mid]){
$high=$mid-1;
}else{
$low=$mid+1;
}
}
return false;
}
//5、快速排序
function quick_sort($arr) {
$n=count($arr);
if($n<=1)
return $arr;
$key=$arr[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i<$n;$i++) {
if($arr[$i]<=$key)
$left_arr[]=$arr[$i];
else
$right_arr[]=$arr[$i];
}
$left_arr=quick_sort($left_arr);
$right_arr=quick_sort($right_arr);
return array_merge($left_arr,array($key),$right_arr);
}
//6、選擇排序
function select_sort($arr) {
$n=count($arr);
for($i=0;$i<$n;$i++) {
$k=$i;
for($j=$i+1;$j<$n;$j++) {
if($arr[$j]<$arr[$k])
$k=$j;
}
if($k!=$i) {
$temp=$arr[$i];
$arr[$i]=$arr[$k];
$arr[$k]=$temp;
}
}
return $arr;
}
//7、插入排序
function insertSort($arr) {
$n=count($arr);
for($i=1;$i<$n;$i++) {
$tmp=$arr[$i];
$j=$i-1;
while($arr[$j]>$tmp) {
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
$j--;
if($j<0)
break;
}
}
return $arr;
}
您可能感興趣的文章:
相關(guān)文章
Yii2 中實(shí)現(xiàn)單點(diǎn)登錄的方法
這篇文章主要介紹了Yii2 中實(shí)現(xiàn)單點(diǎn)登錄的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
PHP+Mysql+Ajax+JS實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)
最近做了個(gè)項(xiàng)目,需要用到省市區(qū)三級(jí)聯(lián)動(dòng),上網(wǎng)翻了不少資料,于是有了下面的思路和代碼2014-05-05
php代碼把全角數(shù)字轉(zhuǎn)為半角數(shù)字
這篇文章介紹了php代碼把全角數(shù)字轉(zhuǎn)為半角數(shù)字的方法,涉及php針對(duì)數(shù)組的遍歷、計(jì)算、輸出等簡(jiǎn)單操作技巧,需要的朋友可以參考一下2007-12-12
win7 wamp 64位 php環(huán)境開(kāi)啟curl服務(wù)遇到的問(wèn)題及解決方法
這篇文章主要介紹了PHP簡(jiǎn)單開(kāi)啟curl的方法,較為詳細(xì)的講述了PHP開(kāi)啟curl函數(shù)庫(kù)的具體步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-09-09
基于PHP實(shí)現(xiàn)商品成交時(shí)發(fā)送短信功能
這篇文章主要介紹了基于PHP實(shí)現(xiàn)商品成交時(shí)發(fā)送短信的功能,代碼簡(jiǎn)單易懂,需要的朋友可以參考下2016-05-05
php實(shí)現(xiàn)產(chǎn)品加入購(gòu)物車(chē)功能(1)
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)產(chǎn)品加入購(gòu)物車(chē)功能,具有一定的參考價(jià)值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

