摘要:閑來(lái)無(wú)事,對(duì)基礎(chǔ)的排序算法做了溫故,直接上代碼。同時(shí)將代碼貼在了上八大排序算法的實(shí)現(xiàn)和效率測(cè)試插入排序希爾排序標(biāo)準(zhǔn)冒泡排序快速排序直接選擇排序堆排序歸并排序基數(shù)排序
閑來(lái)無(wú)事,對(duì)基礎(chǔ)的排序算法做了溫故,直接上代碼。
同時(shí)將代碼貼在了gist上:八大排序算法的 PHP 實(shí)現(xiàn) 和 效率測(cè)試
= 0 && $lists[$j] > $key; $j--) { $lists[$j + 1] = $lists[$j]; $lists[$j] = $key; } } 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 bubble_sort(array $lists) { $num = count($lists); for ($i = 0; $i < $num; $i++) { for ($j = $i + 1; $j < $num; $j++) { if ($lists[$i] > $lists[$j]) { $key = $lists[$i]; $lists[$i] = $lists[$j]; $lists[$j] = $key; } } } return $lists; } /** * 快速排序 * * @param array $lists * @param $left * @param $right * @return array */ function quick_sort(array &$lists, $left = 0, $right = null) { if (is_null($right)) { $right = count($lists) - 1; } if ($left >= $right) { return $lists; } $key = $lists[$left]; $low = $left; $high = $right; while ($left < $right) { while ($left < $right && $lists[$right] > $key) { $right--; } $lists[$left] = $lists[$right]; while ($left < $right && $lists[$left] < $key) { $left++; } $lists[$right] = $lists[$left]; } $lists[$right] = $key; quick_sort($lists, $low, $left - 1); quick_sort($lists, $left + 1, $high); return $lists; } /** * 直接選擇排序 * * @param array $lists * @return array */ function select_sort(array $lists) { $n = count($lists); for ($i = 0; $i < $n; $i++) { $key = $i; for ($j = $i + 1; $j < $n; $j++) { if ($lists[$j] < $lists[$key]) { $key = $j; } } $val = $lists[$key]; $lists[$key] = $lists[$i]; $lists[$i] = $val; } 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 . " " . 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 . " " . 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); } } /** * 歸并排序 * * @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; } /** * 基數(shù)排序 * * @param array $lists * @return array */ function radix_sort(array $lists) { $radix = 10; $max = max($lists); $k = ceil(log($max, $radix)); if ($max == pow($radix, $k)) { $k++; } for ($i = 1; $i <= $k; $i++) { $newLists = array_fill(0, $radix, []); for ($j = 0; $j < count($lists); $j++) { $key = $lists[$j] / pow($radix, $i - 1) % $radix; $newLists[$key][] = $lists[$j]; } $lists = []; for ($j = 0; $j < $radix; $j++) { $lists = array_merge($lists, $newLists[$j]); } } return $lists; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/21229.html
摘要:今天,一條就帶大家徹底跨過排序算法這道坎,保姆級(jí)教程建議收藏。利用遞歸算法,對(duì)分治后的子數(shù)組進(jìn)行排序?;舅枷攵雅判蚴抢枚堰@種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為,它也是不穩(wěn)定排序。 ...
摘要:本篇博客我要來(lái)和大家一起聊一聊數(shù)據(jù)結(jié)構(gòu)初階中的最后一篇博客八大經(jīng)典排序算法的總結(jié),其中會(huì)介紹他們的原來(lái),還有復(fù)雜度的分析以及各種優(yōu)化??焖倥判蜻f歸版本快速排序是于年提出的一種二叉樹結(jié)構(gòu)的交換排序方法。 ...
閱讀 3204·2021-11-25 09:43
閱讀 3415·2021-11-11 16:54
閱讀 842·2021-11-02 14:42
閱讀 3760·2021-09-30 09:58
閱讀 3670·2021-09-29 09:44
閱讀 1287·2019-08-30 15:56
閱讀 2105·2019-08-30 15:54
閱讀 2993·2019-08-30 15:43