周末抽时间整理下算法,完整导图可点击下面链接获取。

点我看完整算法导图

八种排序算法的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实现的更多相关文章

  1. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  2. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

  3. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  4. 十大经典排序算法总结(JavaScript描述)

    前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...

  5. 十大经典排序算法(python实现)(原创)

    个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...

  6. 十大经典排序算法+sort排序

    本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...

  7. 十大经典排序算法的 JavaScript 实现

    计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...

  8. 七种常见经典排序算法总结(C++)

    最近想复习下C++,很久没怎么用了,毕业时的一些经典排序算法也忘差不多了,所以刚好一起再学习一遍. 除了冒泡.插入.选择这几个复杂度O(n^2)的基本排序算法,希尔.归并.快速.堆排序,多多少少还有些 ...

  9. 一文搞定十大经典排序算法(Java实现)

    本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一 ...

随机推荐

  1. AIM Tech Round (Div. 2)

    A. Save Luke 题意:给一个人的长度d,然后给一个区间长度0~L,给你两个子弹的速度v1,v2,两颗子弹从0和L向中间射去(其实不是子弹,是一种电影里面那种绞牙机之类的东西就是一个人被困在里 ...

  2. spring security BCryptPasswordEncoder加密解密,不错的随机盐,不错的加密解密方法

    项目中用这个加密感觉不错啊,推荐: 1.先大体看看,了解一下 浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(match ...

  3. linux主编号的动态分配

    一些主设备编号是静态分派给最普通的设备的. 一个这些设备的列表在内核源码树的 Documentation/devices.txt 中. 分配给你的新驱动使用一个已经分配的静态编号的机会 很小, 但是, ...

  4. P1087 N个数的最大公约数

    题目描述 今天灵灵学习了使用欧几里得算法(即:辗转相除法)求解两个数的最大公约数.于是他决定用这个方法求解 \(N\) 个数的最大公约数. 输入格式 输入的第一行包含一个整数 \(N(1 \le N ...

  5. javascript中的深拷贝与浅拷贝

    javascript中的深拷贝与浅拷贝 基础概念 在了解深拷贝与浅拷贝的时候需要先了解一些基础知识 核心知识点之 堆与栈 栈(stack)为自动分配的内存空间,它由系统自动释放: 堆(heap)则是动 ...

  6. hdu 6851 Vacation(思维+贪心)

    传送门 •题意 有编号0到n,n+1辆车排队过红绿灯,从0到n离交通灯线越来越近 每辆车都有一个最大速度v,车身长度l,和离交通灯线的距离s, 一辆车头到达线则说明这辆车已到达线 如果一辆车前面没有紧 ...

  7. pytorch 中的数据类型,tensor的创建

    pytorch中的数据类型 import torch a=torch.randn(2,3) b=a.type() print(b) #检验是否是该数据类型 print(isinstance(a,tor ...

  8. markdown设置编辑基本语法

    看到其他人写的东西,版面设计,文字样式,区域划分都是那么好看,我一直不知道是怎么设计的,今天发现了,做以记录. #一.设置Markdown编辑模式 二.Markdown编辑语法 一.标题 在想要设置为 ...

  9. Omnigraffle 许可证

    名字:Appked 序列号:MFWG-GHEB-HYTW-CGHT-CSXU-QCNC-SXU

  10. jsp中点击一个图片跳转到另一个页面的方法

    1.这是jsp页面中的关于图片的那段代码 <img src="images/tj1.png " id="tj1"></img> 2.跳转 ...