算法学习导图+经典排序算法PHP实现
周末抽时间整理下算法,完整导图可点击下面链接获取。

八种排序算法的php实现

代码如下 拷贝后可直接运行
先上个运行后的图

代码:(有的自己些的 有的根据网友整理)
<?php
/**
* Created by PhpStorm.
* User: 百年黄沙
* Date: 2019/7/28/0020
* Time: 16:21:33
*/ /**
* Class Sort
*/
class Sort
{ /**
* 直接选择排序
*
* 选出剩余最小值放在左边
* 递归
*
* @param $unsort
* @return $mixed
*/
public static function ChoiceSort($unsort)
{
$len = count($unsort);
$temp = $unsort;
for ($i = 0; $i < $len; $i++) {
$min = $temp[$i];
for ($j = $i; $j < $len; $j++) {
if ($temp[$j] < $min) $min = $temp[$j];
}
$key = array_keys($temp, $min);
//最小值
if ($key[0] != $i) {
$temp[$key[0]] = $temp[$i];
$temp[$i] = $min;
}
Sort::halt($unsort, $temp, $i + 1); }
return $temp;
} /**
* 选择排序类 - 堆排序 这个有点难理解 可先看其他的
*
* @param $unsort
* @return array
*/
public static function HeapSort(&$arr)
{
$unsort = $arr;
$count = count($arr);
// 建堆 (下标小于或等于floor($count/2)-1的节点都是要调整的节点)
for ($i = floor($count / 2) - 1; $i >= 0; $i--) {
Sort::CreateHeap($arr, $i, $count);
} // 调整堆
for ($i = $count - 1; $i >= 0; $i--) {
//将堆顶元素与最后一个元素交换
Sort::swap($arr, 0, $i);
Sort::CreateHeap($arr, 0, $i - 1);
Sort::halt($unsort,$arr,17-$i);
} } //建立堆
public static function CreateHeap(&$arr, $start, $end)
{
$temp = $arr[$start];
//沿关键字较大的孩子节点向下筛选,这里数组开始下标识0
for ($j = 2 * $start + 1; $j <= $end; $j = 2 * $j + 1) {
if ($j != $end && $arr[$j] < $arr[$j + 1]) {
$j++;
}
if ($temp < $arr[$j]) {
//将根节点设置为子节点的较大值
$arr[$start] = $arr[$j];
$start = $j;
}
}
$arr[$start] = $temp; } /**
* 插入类-直接插入排序
*
* 从第一个元素开始,该元素可以认为已经排好序,
* 取下一个,在已经排好序的序列中向前扫描,
* 有元素大于这个新元素,将已经在排好序中的元素移到下一个位置,
* 依次执行
*
* @param $unsort
* @return array
*/
public static function InsertSort($unsort)
{
$sort = array();
$len = count($unsort);
$sort[0] = $unsort[0];
for ($i = 1; $i < $len - 1; $i++) {
$sort[$i] = $unsort[$i];
for ($j = $i; $j > 0; $j--) {
if ($sort[$j] < $sort[$j - 1]) {
Sort::swap($sort, $j, $j - 1);
}
}
Sort::halt($unsort,$sort,$i);
}
return $sort;
} /**
* 插入类-shell排序
* @param $unsort
* @return array
*/
public static function ShellSort($unsort)
{
$count = count($unsort);
$inc = $count; //增量
do {
//计算增量
//$inc = floor($inc / 3) + 1;
$inc = ceil($inc / 2);
for ($i = $inc; $i < $count; $i++) {
$temp = $unsort[$i]; //设置哨兵
//需将$temp插入有序增量子表
for ($j = $i - $inc; $j >= 0 && $unsort[$j + $inc] < $unsort[$j]; $j -= $inc) {
$unsort[$j + $inc] = $unsort[$j]; //记录后移
}
//插入
$unsort[$j + $inc] = $temp;
}
//增量为1时停止循环
} while ($inc > 1);
return $unsort;
} /**
* 交换排序 - 冒泡排序
*
* 重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。
* 走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。
* @param array $unsort
* @return array
*/
public static function BubbleSort(array $unsort)
{
$sort = $unsort;
$len = count($unsort);
for ($i = 0; $i < $len - 1; $i++) {
for ($j = 1; $j < $len; $j++) {
if ($sort[$j] < $sort[$j - 1]) {
Sort::swap($sort, $j, $j - 1);
}
}
Sort::halt($unsort, $sort, $i + 1);
}
return $sort;
} /**
* 交换排序 - 快速排序
*
* 通过设置一个初始中间值,来将需要排序的数组分成3部分,
* 小于中间值的左边,中间值,大于中间值的右边,
* 继续递归用相同的方式来排序左边和右边,最后合并数组
*
* @param array $unsort
* @return array
*/
public static function FastSort($unsort)
{
$len = count($unsort);
if ($len <= 1) {
return $unsort;
}
$middle = $unsort[0]; //取中间标尺
$left = array();
$right = array(); //todo 0 已被选做middle 注意
for ($i = 1; $i < $len; $i++) {
if ($unsort[$i] < $middle) {
$left[] = $unsort[$i];
} else {
$right[] = $unsort[$i];
}
}
$left = Sort::FastSort($left);
$right = Sort::FastSort($right);
return array_merge($left, array($middle), $right);
} /**
* 归并排序 这个好像有点问题
*
* 把序列分成元素尽可能相等的两半。
* 把两半元素分别进行排序。
* 把两个有序表合并成一个。
*
* @param $unsort
* @return array
*/
public static function MergeSort($unsort)
{
$sort = array();
$len = count($unsort);
$divide = $len / 2;
$part1 = array_slice($unsort, 0, $divide);
$part2 = array_slice($unsort, $divide, $len - $divide);
$one = Sort::FastSort($part1);
$two = Sort::FastSort($part2);
$lone = count($one);
$ltwo = count($two);
//todo
for ($i = 0; $i < $lone; $i++) {
if ($one[$i] < $two[$i]) {
$sort[$i] = $one[$i];
} else {
$sort[$i] = $two[$i];
}
}
return $sort;
} /**
* 桶排序
*
* 桶排序的原理是先安排N+1个桶作为容器,若数据范围为N的话。
* 然后将测试数据(所需排序的数据)进行循环,放入对应的桶内。数据一定是在范围N内的。
* 最后,循环桶里的元素,并且输出,进行从大到小或从小到大的排序。
*
* 浪费空间
* 无法比较浮点数值
*
* @param $usort
* @return array
*/
public static function BucketSort($unsort)
{
//取出值的范围
$len = max($unsort);
//设置默认数组,默认值为0;
for ($i = 0; $i <= $len; $i++) {
$sort[$i] = 0;
}
for ($j = 0; $j < count($unsort); $j++) {
$sort[$unsort[$j]]++;
}
foreach ($sort as $k => $v) {
if (!empty($v)) {
$arr[] = $k;
}
}
return $arr;
} /**
* 公共交换位置方法
* @param array $arr 待换数据
* @param $a 位置1
* @param $b 位置2
*/
public static function swap(array &$arr, $a, $b)
{
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
} /**
* 优化显示
* @param $unsort
* @param $arr
* @param $i
*/
public static function halt($unsort, $arr, $i)
{
if ($i == 1) {
echo "待 处 理 :" . '[' . implode(" ", $unsort) . ']' . PHP_EOL;
}
echo "第" . $i . "次处理:" . '[' . implode(" ", $arr) . ']' . PHP_EOL;
} } $uns = [14, 7, 23, 98, 43, 6, 8, 22];
$uns = [200, 13, 42, 34, 56, 23, 67, 365, 400, 54, 68, 3, 574, 5345, 645, 56778, 8978]; //选择排序
print_r(Sort::ChoiceSort($uns)); //堆排序
print_r(Sort::HeapSort($uns)); //插入排序
print_r(Sort::InsertSort($uns)); //shell 排序
print_r(Sort::ShellSort($uns)); //冒泡排序
print_r(Sort::BubbleSort($uns)); //快速排序
print_r(Sort::FastSort($uns)); //归并排序
print_r(Sort::MergeSort($uns)); //桶排序
print_r(Sort::BucketSort($uns));
持续更新
算法学习导图+经典排序算法PHP实现的更多相关文章
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...
- 十大经典排序算法的 JavaScript 实现
计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...
- 七种常见经典排序算法总结(C++)
最近想复习下C++,很久没怎么用了,毕业时的一些经典排序算法也忘差不多了,所以刚好一起再学习一遍. 除了冒泡.插入.选择这几个复杂度O(n^2)的基本排序算法,希尔.归并.快速.堆排序,多多少少还有些 ...
- 一文搞定十大经典排序算法(Java实现)
本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一 ...
随机推荐
- Python--day47--内容回顾
1.什么是数据库
- gSOAP calc服务端与客户端示例
1. Web服务定义描述头文件 typedef double xsd__double; int ns__add(xsd__double a, xsd__double b, xsd__double &a ...
- 带你认识“货真价实”的P2P网贷风控
文/杨帆 说起P2P,多数金融圈内人士已经并不陌生.国内现有近千家的P2P网贷平台,动辄打出高息诱人的收益率宣传口号以及眼花缭乱的安全承诺.但是在这些浮华表面的背后,关于P2P的风控很多人仍然是一 ...
- ubuntu snmp 安装与配置
0.说明 关于一个完整的教程,还是那句话,国内的要么不完整,要么就太旧了,而且思路也不清晰,所以这里写一篇完整的给大家分享一下. 虽然对于Linux主机的监控可以通过执行特定的命令来完成,但是相比之后 ...
- P1101 走迷宫一
题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...
- Linux 旗标实现
Linux 内核提供了一个遵守上面语义的旗标实现, 尽管术语有些不同. 为使用旗标, 内核 代码必须包含 <asm/semaphore.h>. 相关的类型是 struct semaphor ...
- linux内核指针和错误值
很多内部内核函数返回一个指针值给调用者. 许多这些函数也可能失败. 大部分情况, 失 败由返回一个 NULL 指针值来指示. 这个技术是能用的, 但是它不能通知问题的确切特性. 一些接口确实需要返回一 ...
- linux 注册一个 PCI 驱动
为了被正确注册到内核, 所有的 PCI 驱动必须创建的主结构是 struct pci_driver 结构. 这个结构包含许多函数回调和变量, 来描述 PCI 驱动给 PCI 核心. 这里是这个结构的一 ...
- 实现页面查看xml或json数据类似控制台效果
在前端查看xml或者json数据时,实现在类似与控制台中console的效果. 配合Ant Design的Collapse折叠面板进行展示. Collapse组件的地址:https://ant.des ...
- koa2实现简单的验证码
//首先引入svg-captcha,https://www.npmjs.com/package/svg-captcha const svgCaptcha = require('svg-captcha) ...