PHP中经典的排序算法如何实现,代码是什么
Admin 2022-08-02 群英技术资讯 488 次浏览
两两相比,每循环一轮就不用再比较最后一个元素了,因为最后一个元素已经是最大或者最小。
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; }
选定一个作为基本值,剩下的和这个比较,然后调换位置。
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; }
原理就是拿出一个标尺值,然后分为左右两个数组,分别对比
function kuaisuSort ($list) { $len = count($list); if ($len <= 1) {//递归出口 return $list; } $base = $list[0];//选择一个比较值 $leftList = $rightList = []; for ($i = 1; $i < $len; $i++) { if ($base > $list[$i]) { $leftList[] = $list[$i]; } else { $rightList[] = $list[$i]; } } //递归分别再处理左右两边的数组 $leftList = kuaisuSort($leftList); $rightList = kuaisuSort($rightList); return array_merge($leftList, [$base], $rightList); }
假设前面的数都是排好顺序的,要把第n个数插入到有序里
function charuSort ($list) { $len = count($list); for ($i = 1; $i < $len; $i++) { $tmp = $list[$i];//获取对比元素 for ($j = $i - 1; $j > 0; $j--) { if ($list[$j] > $tmp) { $list[$j + 1] = $list[$j]; $list[$j] = $tmp; } else { break; } } } return $list; }
当然PHP还能实现其他的常见排序算法,如归并排序、希尔排序、堆排序等
归并排序
/** * 归并排序 * * @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; }
希尔排序
/** * 希尔排序 标准 * * @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); } }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
我们在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况。特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列化操作。 序列化(串行化):是将变量转换为可保存或传输的字符串的过程; 反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。 这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。 常见的php序列化和反序列化方式主要有:serialize,unserialize;json_encode,json_decode。_来自PHP 教程,w3cschool编程狮。
本篇文章小编给大家分享一下Pandas时间类型转换与处理代码实现示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
很多朋友问php扩展安装方法,下面就给大家php扩展安装方法步骤,本文也有详细的步骤介绍,对这方面有需求的朋友可以看一看,希望大家能有所收获。
本文主要给大家分享的是关于laravel数据验证的内容,下文是小编整理的一些laravel数据验证规则,具有一定的参考借鉴价值,有这个方面学习需要的朋友可以参考学习。
今天小编就为大家分享一篇实现laravel 插入操作日志到数据库的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008