八大算法原理详解

交换函数:注意要按引用传递,否则无法真正交换两个数的值

  function exchange(&$a, &$b){
$temp = $a;
$a = $b;
$b = $temp;
}

1、直接插入算法

    //第一种实现
  function insert_sort($arr){
for ($i = 0; $i < count($arr)-1; $i++){
for($j = $i+1; $j > 0; $j--){
if($arr[$j] > $arr[$j-1]){
exchage($arr[$j], $arr[$j-1]);
}
}
}
return $arr;
}
  //第二种实现
function insert_sort($arr){
for ($i = 0; $i < count($arr)-1; $i++){
$j = $i + 1;
while($j > 0){
if($arr[$j] > $arr[$j-1]){
exchage($arr[$j], $arr[$j-1]);
}
$j--;
}
}
return $arr;
}

2、希尔排序算法【暂缺】

3、直接选择排序算法

    function select_sort($arr){
for($i = 0; $i < count($arr); $i++){
$key = $arr[$i];
$n = $i;
for($j = $i+1; $j < count($arr); $j++){
if($key > $arr[$j]){
$key = $arr[$j];
$n = $j;
}
}
$arr[$n] = $arr[$i];
$arr[$i] = $key;
}
return $arr;
}

4、堆排序算法【暂缺】

5、冒泡排序算法

      //第一种
function bubble_sort($arr){
for($i = 0; $i < count($arr)-1; $i++){
for($j = count($arr)-1; $j > $i; $j--){
if($arr[$j-1] < $arr[$j]){
exchage($arr[$j], $arr[$j-1]);
}
}
}
return $arr;
}
//第二种
function bubble_sort($arr){
for($i = 0; $i < count($arr)-1; $i++){
$j = 0;
while($j < count($arr)-1-$i){
if($arr[$j] < $arr[$j+1]){
exchage($arr[$j], $arr[$j-1]);
}
$j++;
}
}
return $arr;
}

6、快速排序算法

    function quick_sort(&$arr, $p, $r){
if($p < $r){
$q = partition($arr, $p, $r);
quick_sort($arr, $p, $q-1);
quick_sort($arr, $q+1, $r);
}
}
function partition(&$arr, $p, $r){
$i = rand($p, $r); //实现随机化快排
exchange($arr[$i], $arr[$r]);
$n=$p-1;
for($m = $p; $m < $r; $m++){
if($arr[$m] < $arr[$r]){
++$n;
exchange($arr[$m], $arr[$n]);
}
}
exchange($arr[$n+1], $arr[$r]); return $n+1; //n位上的元素,一经排序,则已固定
}

7、归并排序算法【注意:数组按值传输】

  function merge_sort(&$A, $p, $r){
if($p < $r){
$q = floor(($p + $r)/2);
merge_sort($A, $p, $q);
merge_sort($A, $q+1, $r);
merge($A, $p, $q, $r);
}
}
//第一种
function merge(&$A, $p, $q, $r){ //哨兵牌法
$n1 = $q - $p + 1;
$n2 = $r - $q;
for($i = 0; $i < $n1; $i++){
$L[$i] = $A[$p+$i];
}
for($j = 0; $j < $n2; $j++){
$R[$j] = $A[$q+$j+1];
}
//防止越界(哨兵)
$L[$n1] = $R[$n2] = PHP_INT_MAX;
$i = $j = 0;
for($k = $p; $k <= $r; $k++){
if($L[$i] <= $R[$j]){
$A[$k] = $L[$i];
$i++;
}else{
$A[$k] = $R[$j];
$j++;
}
}
}
//第二种
function merge(&$A, $p, $q, $r){
$n1 = $q - $p + 1;
$n2 = $r - $q;
for($i = 0; $i < $n1; $i++){
$L[$i] = $A[$p+$i];
}
for($j = 0; $j < $n2; $j++){
$R[$j] = $A[$q+$j+1];
}
$i = $j = 0;
$k = $p;
while($i<$n1 && $j<$n2){
if($L[$i] <= $R[$j]){
$A[$k++] = $L[$i++];
}else{
$A[$k++] = $R[$j++];
}
} for(; $i<$n1; $i++){
$A[$k++] = $L[$i];
}
for(; $j<$n2; $j++){
$A[$k++] = $R[$j];
}
}

8、基数排序算法【暂缺】

算法-PHP实现八大算法的更多相关文章

  1. 算法:Astar寻路算法改进,双向A*寻路算法

    早前写了一篇关于A*算法的文章:<算法:Astar寻路算法改进> 最近在写个js的UI框架,顺便实现了一个js版本的A*算法,与之前不同的是,该A*算法是个双向A*. 双向A*有什么好处呢 ...

  2. Atitit.软件中见算法 程序设计五大种类算法

    Atitit.软件中见算法 程序设计五大种类算法 1. 算法的定义1 2. 算法的复杂度1 2.1. Algo cate2 3. 分治法2 4. 动态规划法2 5. 贪心算法3 6. 回溯法3 7. ...

  3. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  4. 缓存算法(页面置换算法)-FIFO、LFU、LRU

    在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...

  5. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

  6. Floyd-Warshall算法,简称Floyd算法

    Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3). 使用条件&范围通常可以在任何图中使用,包括有向图.带负权边的图. Floyd-W ...

  7. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  8. 最短路径算法之二——Dijkstra算法

    Dijkstra算法 Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 注意该算法要求图中不存在负权边. 首先我们来定义一个二维数组Edge[MAXN][MAXN]来存储 ...

  9. 页面置换算法(最佳置换算法、FIFO置换算法、LRU置换算法、LFU置换算法)

    页面置换产生的原因是:分页请求式存储管理(它是实现虚拟存储管理的方法之一,其中一个特性是多次性-->多次将页面换入或换出内存) 效果最好的页面置换算法:最佳置换算法 比较常用的页面置换算法有:F ...

随机推荐

  1. bzoj4600 [Sdoi2016]硬币游戏

    Description Alice和Bob现在在玩的游戏,主角是依次编号为1到n的n枚硬币.每一枚硬币都有两面,我们分别称之为正面和反面.一开始的时候,有些硬币是正面向上的,有些是反面朝上的.Alic ...

  2. CTSC2018 && APIO2018 && SDOI2018R2游记

    Day -? 占个坑先.希望CTSC,APIO别打铁,R2别滚粗QAQ CTSC Day 0 早起坐车睡觉颓废报道颓废 反正游记就是咕懒得写了 Day 1 早上四点被xp的闹钟吵醒(???还两次) 幸 ...

  3. Linux.开关机&登出&用户管理

    关机重启: shutdown:         shutdown –h now 立该进行关机         shudown -h 1 "hello, 1 分钟后会关机了"    ...

  4. [LuoguP2900] [USACO08MAR]土地征用(Land Acquisition)

    土地征用 (Link) 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比 ...

  5. [转载]对iOS开发中内存管理的一点总结与理解

    对iOS开发中内存管理的一点总结与理解   做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...

  6. 使用BSRR和BRR寄存器直接操作STM32的I/O端口

    STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置'1'或置'0'. GPIOx_BSRR的高16位中每 ...

  7. Oracle 体系结构四 逻辑和物理存储结构之间的关系

    Oracle数据库从物理存储中完全抽象出逻辑存储.逻辑数据存储采用“段”的形式.段的类型有很多种:典型的段是“表”.这些段以物理形式存储在数据文件中.通过表空间将逻辑存储从物理存储中抽象出来.逻辑结构 ...

  8. OS--lab0+lab1+lab4+lab5+lab6+lab7

    URL:https://github.com/Chasssser/MytestOR(Linux) git clone https://github.com/Chasssser/Mytest

  9. Python模拟校园网登录

    最近忙着实验室的项目,学习的时间相对较少.前一段时间刚开始接触python时,依葫芦画瓢照着写了一个爬虫,爬取了某个网站的图片.当看到一张张图片自动出现在电脑屏幕上时,有些小小成就感.我想大多数人开始 ...

  10. 创建jq插件步骤

    无意看了这篇<jQuery插件开发精品教程,让你的jQuery提升一个台阶>文章,现在做一下总结. 一.jQuery插件的创建可以有三种方法 1.通过$.extend()来扩展jQuery ...