算法学习导图+经典排序算法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语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一 ...
随机推荐
- [转]C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- Codeforces Round #184 (Div. 2)
A. Strange Addition (目前的做法好像做烦了) 统计数的\(mask\),表示个.十.百位上是否是0,共8种数. 枚举8种数组成的所有情况\(2^8\),记录最大数量. B. Con ...
- call undefined function openssl_cipher_iv_length
现象: 访问localhost/blog/public时,报错在verdor/framework/src/Illuminate/Encryption/Encrtpter.php的84行,找不到open ...
- H3C DHCP服务器基本配置示例
- 记一次奇葩事——html5可能不支持window.onscroll函数
只在html5里遇到,html4没事:拿出来聊聊,路过帮忙解答下!!! 不正常的 <!doctype html><html><head><meta chars ...
- sqlyog提示:没有执行查询。请在 SQL 窗口中输入查询或将光标放在一个查询上。
以下内容纯属猜测: sqlyog 在执行输入的sql语句时,对已经执行过的语句,是不会再执行的,所以出现这个问题,很可能是sql语句没有修改,就试图执行第二遍.
- Loj3033 JOISC 2019 Day2两个天线
Loj3033 JOISC 2019 Day2两个天线 下午唯一听懂的题目但,但还是比较模糊.写一篇题解来加深一下印象. 题目大意:给定\(n\)根天线,第\(i\)跟天线的高度为\(h_i\),切它 ...
- windows键的妙用
(1)当你需要暂时离开电脑一会儿,怕其余人动你的电脑时,你只需要按windows键+L就可以了,当然前提是你给自己的电脑设置过开机密码. (2)有时候你需要在盘里边找某个文件,但你的桌面上密密麻麻的, ...
- 从头学pytorch(三) 线性回归
关于什么是线性回归,不多做介绍了.可以参考我以前的博客https://www.cnblogs.com/sdu20112013/p/10186516.html 实现线性回归 分为以下几个部分: 生成数据 ...
- Spring||Interview
1.依赖注入(DI)(IOC) 对象本身不负责对象的创建和维护,将控制权转交给外部的容器实现,降低程序的耦合度,只提供java方法让容器决定依赖关系,依赖关系的对象通过JavaBean属性或者构造函数 ...