常見的php排序算法
成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比羅平網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式羅平網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋羅平地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
本文匯總了常見的php排序算法,在進(jìn)行算法設(shè)計(jì)的時(shí)候有不錯(cuò)的借鑒價(jià)值?,F(xiàn)分享給大家供參考之用。具體如下:
一、插入排序
用文字簡單的描述,比如說$arr = array(4,2,4,6,3,6,1,7,9); 這樣的一組數(shù)字進(jìn)行順序排序:
那么,首先,拿數(shù)組的第二個(gè)元素和第一元素比較,假如第一個(gè)元素大于第二元素,那么就讓兩者位置互換,接下來,拿數(shù)組的第三個(gè)元素,分別和第二個(gè),第一個(gè)元素比較,假如第三個(gè)元素小,那么就互換。依次類推。這就是插入排序,它的時(shí)間頻度是:1+2+...+(n-1)=(n^2)/2。則它的時(shí)間復(fù)雜度為O(n^2).
php實(shí)現(xiàn)代碼如下:
?phpfunction Sort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=1;$i$count;$i++){ tmp="$arr[$i];" j=""=0$arr[$j]$arr[$i]){ return=""
二、選擇排序
選擇排序用語言描述的話,可以這樣,如:$arr = array(4,3,5,2,1);
首先,拿第一個(gè)和后面所有的比,找出最小的那個(gè)數(shù)字,然后和第一個(gè)數(shù)組互換(當(dāng)然,如果是第一個(gè)最小,那么就不用互換了),接著循環(huán),即:拿第二個(gè)和后面的比較,找出最小的數(shù)字,然后和第二個(gè)數(shù)字互換,依次類推,也就是說每次都是找出剩余最小的值。 可得到:第一次,時(shí)間頻度 是n, (第一個(gè)和后面的n-1個(gè)比較,找到最小的,再看是不是第一個(gè),不是第一個(gè)的話進(jìn)行互換) 在往后,依次是 減一 。 它的時(shí)間復(fù)雜度,也是O(n^2);
php實(shí)現(xiàn)代碼如下:
?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ $min=$i; for(j=$i+1;$j$count;$j++){$arr[$j]){ $min = $j; //找到最小的那個(gè)元素的下標(biāo) } } if($min!=$i){//如果下標(biāo)不是$i 則互換。 $tmp= $arr[$i]; $arr[$i] = $arr[$min]; $arr[$min] = $tmp; } } return $arr; }?
三、冒泡排序
冒泡排序其實(shí)上是和選擇排序相比,并無明顯差別。都是找到最小的,放到最左端。依次循環(huán)解決問題。差別在于冒泡排序的交換位置的次數(shù)較多,而選擇排序則是找到最小的元素的下標(biāo),然后直接和最左端的交換位置。
php實(shí)現(xiàn)代碼如下:
?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ for(j=$i+1;$j$count;$j++){$arr[$j]){ $tmp= $arr[$i]; $arr[$i] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; }?
四、快速排序
快速排序,用語言來形容的話,從數(shù)組中選擇一個(gè)值$a,然后和其余元素進(jìn)行比較,比$a大的放到數(shù)組right中,反之,放到數(shù)組left中。然后將left right 分別進(jìn)行遞歸調(diào)用,即:再細(xì)分left right ,最后進(jìn)行數(shù)組的合并。
php實(shí)現(xiàn)快速排序:
?phpfunction mySort($arr){ $count = count($arr); if($count2){ return $arr; } $key = $arr[0];//選擇第一個(gè)元素作為比較元素,可選其他 $left = array(); $right = array(); for($i=1;$i$count;$i++){ key=""=$arr[$i]){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } $left = mySort($left); $right = mySort($right); $result = array_merge($left,$right); return $result; }?
五、歸并排序
其實(shí)歸并排序是一種拆分,合并的思想。和快速排序思想有共通之處,左邊一堆,右邊一堆,然后進(jìn)行合并。通過遞歸實(shí)現(xiàn)排序。 區(qū)別之處呢? 他們的區(qū)別也是思想上本質(zhì)的區(qū)別,快速排序的拆分,是選擇了特定的值進(jìn)行大小比較,從而分為left 和 right 。也就是小的一堆放入left,大的一堆放入right。而后,小的left 再細(xì)分為left1 right1。。。。通過進(jìn)行類似的遞歸完成排序。也就是說,一直細(xì)分下去,遞歸最末尾的left1就是最小值。
而歸并排序,是從幾何上的左右切分,一直遞歸切分成2或者1的'最小粒度的數(shù)組,然后才開始進(jìn)行比較大小,然后合并。此處的比較大小是:兒子left的元素 和兒子的right元素 進(jìn)行比較,而后進(jìn)行排序合并成為父親left或者right。在此,直到拿到各自排序合并完成最后兩個(gè)數(shù)組:最起初的left 和right,也僅僅直到他們各自的順序,并不能確認(rèn)整個(gè)數(shù)組的順序,還是需要通過最終的left right 比較后合并才能完成真正意義上的排序。
?phpfunction gbSort($arr){ if(count($arr)=1){return min="floor(count($arr)/2);//取中間數(shù)字進(jìn)行拆分" left="gbSort($left);" right="gbSort($right);" return="" function=""$right[0] ? array_shift($right) : array_shift($left); //進(jìn)行比較,小的移除,并且放入到數(shù)組$m中。 } return arr_merge($m,$left,$right);//進(jìn)行合并(由于不知道left right 哪個(gè)會為空,所以進(jìn)行統(tǒng)一合并)}?
六、堆排序
本例中fixDown函數(shù)實(shí)現(xiàn)對某一個(gè)節(jié)點(diǎn)的向下調(diào)整,這里默認(rèn)的是起始節(jié)點(diǎn)為1,方便計(jì)算父子節(jié)點(diǎn)關(guān)系
注:
起始節(jié)點(diǎn)為1的父子關(guān)系: 父節(jié)點(diǎn)k, 子節(jié)點(diǎn)為2K、2k+1 子節(jié)點(diǎn)j, 父節(jié)點(diǎn)為 floor(j/2) floor為向下取整
起始節(jié)點(diǎn)為0的父子關(guān)系: 父節(jié)點(diǎn)k, 子節(jié)點(diǎn)為2K+1, 2k+2 子節(jié)點(diǎn)j, 父節(jié)點(diǎn)為 floor((j-1)/2)
參數(shù)$k為調(diào)整點(diǎn)位置, $lenth為數(shù)組長度,也就是從1起始到最后一個(gè)節(jié)點(diǎn)的坐標(biāo).
?phpfunction fixDown($arr, $k, $lenth){while(2*$k=$lenth) { //只要當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn), 就需要繼續(xù)該循環(huán) $j = $k*2; if ($j$lenth $arr[$j]$arr[$j+1]) $j++; // 只要子節(jié)點(diǎn)有右節(jié)點(diǎn),且右節(jié)點(diǎn)比左節(jié)點(diǎn)大,那么切換到右節(jié)點(diǎn)操作。 if ($arr[$j] $arr[$k]) break; // 如果子節(jié)點(diǎn)都沒有父節(jié)點(diǎn)大, 那么調(diào)整結(jié)束。 exch($arr[$j], $arr[$k]); $k = $j; }}function exch($a, $b) { $tmp = $a; $a = $b; $b = $tmp;}function headSort($arr){ $len = count($arr); array_unshift($arr, NULL); for($i=$len/2;$i=1;$i--) { fixDown($arr, $i, $len); } while($len1) { exch($arr[1], $arr[$len]); fixDown($arr, 1, --$len); } array_shift($arr);}$arr = array(4,6,4,9,2,3);headSort($arr);?
希望本文所述排序算法實(shí)例對大家的php程序設(shè)計(jì)有所幫助。
;
如果你已經(jīng)使用了一段時(shí)間PHP的話,那么,你應(yīng)該已經(jīng)對它的數(shù)組比較熟悉了——這種數(shù)據(jù)結(jié)構(gòu)允許你在單個(gè)變量中存儲多個(gè)值,并且可以把它們作為一個(gè)集合進(jìn)行操作。
經(jīng)常,開發(fā)人員發(fā)現(xiàn)在PHP中使用這種數(shù)據(jù)結(jié)構(gòu)對值或者數(shù)組元素進(jìn)行排序非常有用。PHP提供了一些適合多種數(shù)組的排序函數(shù),這些函數(shù)允許你在數(shù)組內(nèi)部對元素進(jìn)行排列,也允許用很多不同的方法對它們進(jìn)行重新排序。在這篇文章中我們將討論該排序中最重要的幾個(gè)函數(shù)。
簡單排序
首先,讓我們來看看最簡單的情況:將一個(gè)數(shù)組元素從低到高進(jìn)行簡單排序,這個(gè)函數(shù)既可以按數(shù)字大小排列也可以按字母順序排列。PHP的sort()函數(shù)實(shí)現(xiàn)了這個(gè)功能,如Listing A所示:
Listing A
?php
? $data = array(5,8,1,7,2);
? sort($data);
? print_r($data);
? ?
輸出結(jié)果如下所示:
Array ([0] = 1
[1] = 2
[2] = 5
[3] = 7
[4] = 8
)
$a
=
array(2=array(1,2,3,4),6=array(6,2,3,5),1=array(1,4,53));
$b
=
array_values($a);//返回?cái)?shù)組中的所有值,形成新的數(shù)組,建立數(shù)字索引
array_multisort?對多個(gè)數(shù)組或多維數(shù)組進(jìn)行排序 排序的依據(jù)可以是自定義,完全可以用一個(gè)一維數(shù)組去排序多維數(shù)組.
$arrSort?=?[];
foreach($arr?as?$info)?{
$arrSort[]?=?$info['o'];
}
sort($arrSort);
array_multisort($arrSort,?$arr);
array_multisort
你研究一下.這個(gè)是完全可行的.
一、先看最簡單的情況。有兩個(gè)數(shù)組:
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
array_multisort($arr1,$arr2);
print_r($arr1); // 得到的順序是1,5,9
print_r($arr2); // 得到的順序是6,4,2
我估計(jì)兩個(gè)數(shù)組的值自始至終都是對應(yīng)著的:1對應(yīng)6,9對應(yīng)2,5對應(yīng)4。
我們再加多一個(gè)數(shù)組看看會怎樣:
$arr1 = array(1,9,5);
$arr2 = array(6,2,4);
$arr3 = array(3,7,8);
array_multisort($arr1,$arr2,$arr3);
查看結(jié)果,1自始至終都對應(yīng)6對應(yīng)3,其它項(xiàng)也是如此。這種對應(yīng)關(guān)系就是手冊中所謂的“排序時(shí)保留原有的鍵名關(guān)聯(lián)”。
另外也可以把每個(gè)數(shù)組想像成數(shù)據(jù)庫表的一列。而對應(yīng)著的1,6,3為一數(shù)據(jù)行,9,2,7為另一數(shù)據(jù)行。。。
array_multisort會先按第一個(gè)數(shù)組(想像成列)排序,如果第一個(gè)數(shù)組(列)的值相同,則按第二個(gè)數(shù)組(列)排序。
具體可以用下面的程式來測試:
$arr1 = array(1,9,5,9);
$arr2 = array(6,2,4,1);
$arr3 = array(3,7,8,0);
array_multisort($arr1,$arr2,$arr3);
可以想像這里$arr3的結(jié)果是(3,8,0,7)。
二、接下來講解array_multisort的參數(shù)。這個(gè)函數(shù)的參數(shù)很靈活。最簡單的情況是如上面所示的以1個(gè)或n個(gè)數(shù)組作為參數(shù),需要注意的是每個(gè)數(shù)組的項(xiàng)數(shù)要一樣,否則會warning導(dǎo)致排序失效。
像這樣array_multisort($arr1,$arr2,$arr3); 默認(rèn)是所有數(shù)組都是升序排列,如果想對$arr2降序,并當(dāng)作字符串去比較,就要寫成:
array_multisort($arr1, $arr2, SORT_DESC, SORT_STRING, $arr3);
每個(gè)array后面可以跟一個(gè)排序順序標(biāo)志或一個(gè)排序類型標(biāo)志,或者兩種標(biāo)志同時(shí)出現(xiàn)。但是每種排序標(biāo)志在每個(gè)數(shù)組后面只能出現(xiàn)一個(gè)。
詳細(xì)如下:
排序順序標(biāo)志:
SORT_ASC - 按照上升順序排序(默認(rèn))
SORT_DESC - 按照下降順序排序
排序類型標(biāo)志:
SORT_REGULAR - 將項(xiàng)目按照通常方法比較(默認(rèn))
SORT_NUMERIC - 將項(xiàng)目按照數(shù)值比較
SORT_STRING - 將項(xiàng)目按照字符串比較
三、最后是array_multisort有什么實(shí)際作用。
我們通常有一些多維數(shù)組需要排序:
$guys = Array
(
[0] = Array
(
[name] = jake
[score] = 80
[grade] = A
)
[1] = Array
(
[name] = jin
[score] = 70
[grade] = A
)
[2] = Array
(
[name] = john
[score] = 80
[grade] = A
)
[3] = Array
(
[name] = ben
[score] = 20
[grade] = B
)
)
例如我們想按成績倒序排列,如果成績相同就按名字的升序排列。
這時(shí)我們就需要根據(jù)$guys的順序多弄兩個(gè)數(shù)組出來:
$scores = array(80,70,80,20);
$names = array('jake','jin','john','ben');
然后
array_multisort($scores, SORT_DESC, $names, $guys);就行了
還能不能更靈活一點(diǎn)呢,每次想排序都要另外弄些數(shù)組出來嗎?
其實(shí)在qeephp的helper_array類里面已經(jīng)封裝得很好,下面是它的兩個(gè)方法,需要的人自己修改一下就可以用了:
/**
* 根據(jù)指定的鍵對數(shù)組排序
*
* 用法:
* @code php
* $rows = array(
* array('id' = 1, 'value' = '1-1', 'parent' = 1),
* array('id' = 2, 'value' = '2-1', 'parent' = 1),
* array('id' = 3, 'value' = '3-1', 'parent' = 1),
* array('id' = 4, 'value' = '4-1', 'parent' = 2),
* array('id' = 5, 'value' = '5-1', 'parent' = 2),
* array('id' = 6, 'value' = '6-1', 'parent' = 3),
* );
*
* $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
* dump($rows);
* // 輸出結(jié)果為:
* // array(
* // array('id' = 6, 'value' = '6-1', 'parent' = 3),
* // array('id' = 5, 'value' = '5-1', 'parent' = 2),
* // array('id' = 4, 'value' = '4-1', 'parent' = 2),
* // array('id' = 3, 'value' = '3-1', 'parent' = 1),
* // array('id' = 2, 'value' = '2-1', 'parent' = 1),
* // array('id' = 1, 'value' = '1-1', 'parent' = 1),
* // )
* @endcode
*
* @param array $array 要排序的數(shù)組
* @param string $keyname 排序的鍵
* @param int $dir 排序方向
*
* @return array 排序后的數(shù)組
*/
static function sortByCol($array, $keyname, $dir = SORT_ASC)
{
return self::sortByMultiCols($array, array($keyname = $dir));
}
/**
* 將一個(gè)二維數(shù)組按照多個(gè)列進(jìn)行排序,類似 SQL 語句中的 ORDER BY
*
* 用法:
* @code php
* $rows = Helper_Array::sortByMultiCols($rows, array(
* 'parent' = SORT_ASC,
* 'name' = SORT_DESC,
* ));
* @endcode
*
* @param array $rowset 要排序的數(shù)組
* @param array $args 排序的鍵
*
* @return array 排序后的數(shù)組
*/
static function sortByMultiCols($rowset, $args)
{
$sortArray = array();
$sortRule = '';
foreach ($args as $sortField = $sortDir)
{
foreach ($rowset as $offset = $row)
{
$sortArray[$sortField][$offset] = $row[$sortField];
}
$sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
}
if (empty($sortArray) || empty($sortRule)) { return $rowset; }
eval('array_multisort(' . $sortRule . '$rowset);');
return $rowset;
}
1、在test.php文件內(nèi),使用header設(shè)置test.php執(zhí)行的編碼為utf8,避免輸出中文的時(shí)候出現(xiàn)亂碼。
2、在test.php文件內(nèi),創(chuàng)建一個(gè)測試的數(shù)組,例如,定義一個(gè)分類的數(shù)組,其對應(yīng)的索引值分別為0,4,8。
3、在test.php文件內(nèi),使用array_values()方法將上一步的數(shù)據(jù)重新排序,并且從0開始,把重新排序的數(shù)組保存在$result變量中。
4、在test.php文件內(nèi),使用foreach方法遍歷數(shù)組,其中$k為索引值,$v為索引值對應(yīng)的數(shù)組值。
5、在test.php文件內(nèi),使用echo方法輸出數(shù)組中的索引值和對應(yīng)的數(shù)組值即可。
本文標(biāo)題:php多位數(shù)據(jù)組排序 php多維數(shù)組排序函數(shù)
瀏覽路徑:http://aaarwkj.com/article16/doodgdg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、定制網(wǎng)站、用戶體驗(yàn)、網(wǎng)站策劃、靜態(tài)網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)