本篇内容介绍了“PHP如何实现常见排序算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
两两相比,每循环一轮就不用再比较最后一个元素了,因为最后一个元素已经是最大或者最小。
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);
}
}
“PHP如何实现常见排序算法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。