PHP實(shí)現(xiàn)常見排序算法的示例代碼
1、冒泡排序
兩兩相比,每循環(huán)一輪就不用再比較最后一個(gè)元素了,因?yàn)樽詈笠粋€(gè)元素已經(jīng)是最大或者最小。
function maopaoSort ($list) { $len = count($list); for ($i = 0; $i < $len - 1; $i++) { for ($j = 0; $j < $len - $i - 1; $j++) { if ($list[$j] > $list[$j + 1]) { $tmp = $list[$j]; $list[$j] = $list[$j + 1]; $list[$j + 1] = $tmp; } } } return $list; }
2、選擇排序
選定一個(gè)作為基本值,剩下的和這個(gè)比較,然后調(diào)換位置。
function xuanzeSort ($list) { $len = count($list); for ($i = 0; $i < $len - 1; $i++) { $pos = $i; for ($j = $i + 1; $j < $len; $j++) { if ($list[$pos] > $list[$j]) { $pos = $j; } } if ($pos != $i) { $tmp = $list[$pos]; $list[$pos] = $list[$i]; $list[$i] = $tmp; } } return $list; }
3、快速排序
原理就是拿出一個(gè)標(biāo)尺值,然后分為左右兩個(gè)數(shù)組,分別對(duì)比
function kuaisuSort ($list) { $len = count($list); if ($len <= 1) {//遞歸出口 return $list; } $base = $list[0];//選擇一個(gè)比較值 $leftList = $rightList = []; for ($i = 1; $i < $len; $i++) { if ($base > $list[$i]) { $leftList[] = $list[$i]; } else { $rightList[] = $list[$i]; } } //遞歸分別再處理左右兩邊的數(shù)組 $leftList = kuaisuSort($leftList); $rightList = kuaisuSort($rightList); return array_merge($leftList, [$base], $rightList); }
4、插入排序
假設(shè)前面的數(shù)都是排好順序的,要把第n個(gè)數(shù)插入到有序里
function charuSort ($list) { $len = count($list); for ($i = 1; $i < $len; $i++) { $tmp = $list[$i];//獲取對(duì)比元素 for ($j = $i - 1; $j > 0; $j--) { if ($list[$j] > $tmp) { $list[$j + 1] = $list[$j]; $list[$j] = $tmp; } else { break; } } } return $list; }
補(bǔ)充
當(dāng)然PHP還能實(shí)現(xiàn)其他的常見排序算法,如歸并排序、希爾排序、堆排序等
歸并排序
/** * 歸并排序 * * @param array $lists * @return array */ function merge_sort(array $lists) { $n = count($lists); if ($n <= 1) { return $lists; } $left = merge_sort(array_slice($lists, 0, floor($n / 2))); $right = merge_sort(array_slice($lists, floor($n / 2))); $lists = merge($left, $right); return $lists; } function merge(array $left, array $right) { $lists = []; $i = $j = 0; while ($i < count($left) && $j < count($right)) { if ($left[$i] < $right[$j]) { $lists[] = $left[$i]; $i++; } else { $lists[] = $right[$j]; $j++; } } $lists = array_merge($lists, array_slice($left, $i)); $lists = array_merge($lists, array_slice($right, $j)); return $lists; }
希爾排序
/** * 希爾排序 標(biāo)準(zhǔn) * * @param array $lists * @return array */ function shell_sort(array $lists) { $n = count($lists); $step = 2; $gap = intval($n / $step); while ($gap > 0) { for ($gi = 0; $gi < $gap; $gi++) { for ($i = $gi; $i < $n; $i += $gap) { $key = $lists[$i]; for ($j = $i - $gap; $j >= 0 && $lists[$j] > $key; $j -= $gap) { $lists[$j + $gap] = $lists[$j]; $lists[$j] = $key; } } } $gap = intval($gap / $step); } return $lists; }
堆排序
/** * 堆排序 * * @param array $lists * @return array */ function heap_sort(array $lists) { $n = count($lists); build_heap($lists); while (--$n) { $val = $lists[0]; $lists[0] = $lists[$n]; $lists[$n] = $val; heap_adjust($lists, 0, $n); //echo "sort: " . $n . "\t" . implode(', ', $lists) . PHP_EOL; } return $lists; } function build_heap(array &$lists) { $n = count($lists) - 1; for ($i = floor(($n - 1) / 2); $i >= 0; $i--) { heap_adjust($lists, $i, $n + 1); //echo "build: " . $i . "\t" . implode(', ', $lists) . PHP_EOL; } //echo "build ok: " . implode(', ', $lists) . PHP_EOL; } function heap_adjust(array &$lists, $i, $num) { if ($i > $num / 2) { return; } $key = $i; $leftChild = $i * 2 + 1; $rightChild = $i * 2 + 2; if ($leftChild < $num && $lists[$leftChild] > $lists[$key]) { $key = $leftChild; } if ($rightChild < $num && $lists[$rightChild] > $lists[$key]) { $key = $rightChild; } if ($key != $i) { $val = $lists[$i]; $lists[$i] = $lists[$key]; $lists[$key] = $val; heap_adjust($lists, $key, $num); } }
到此這篇關(guān)于PHP實(shí)現(xiàn)常見排序算法的示例代碼的文章就介紹到這了,更多相關(guān)PHP排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP中防止SQL注入攻擊和XSS攻擊的兩個(gè)簡(jiǎn)單方法
所有有打印的語句如echo,print等 在打印前都要使用htmlentities() 進(jìn)行過濾,這樣可以防止Xss,注意中文要寫出htmlentities2010-04-04PHP session_start()問題解疑(詳細(xì)介紹)
對(duì)于PHP的session功能,始終找不到合適的答案,尤其是一些錯(cuò)誤,還有一些沒有錯(cuò)誤的結(jié)果,最可怕的就是后者,一直為許多的初學(xué)者為難。就連有些老手,有時(shí)都被搞得莫名其妙2013-07-07php連接oracle數(shù)據(jù)庫(kù)的核心步驟
這篇文章主要介紹了php連接oracle數(shù)據(jù)庫(kù)的核心步驟,簡(jiǎn)要分析了php安裝Oracle擴(kuò)展設(shè)置及連接測(cè)試代碼,非常簡(jiǎn)單易懂,需要的朋友可以參考下2016-05-05深入理解PHP中mt_rand()隨機(jī)數(shù)的安全
mt_rand()使用mersennetwister算法返回隨機(jī)整數(shù),這個(gè)大家都知道,但下面這篇文章主要給大家介紹的是關(guān)于PHP中mt_rand()隨機(jī)數(shù)安全的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10php實(shí)現(xiàn)redis數(shù)據(jù)庫(kù)指定庫(kù)號(hào)遷移的方法
這篇文章主要介紹了php實(shí)現(xiàn)redis數(shù)據(jù)庫(kù)指定庫(kù)號(hào)遷移的方法,涉及對(duì)于redis數(shù)據(jù)庫(kù)的操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-01用php代碼限制國(guó)內(nèi)IP訪問我們網(wǎng)站
這篇文章主要介紹了用php代碼限制國(guó)內(nèi)IP訪問我們網(wǎng)站,需要的朋友可以參考下2015-09-09