算法-PHP实现八大算法

八大算法原理详解

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

  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、基数排序算法【暂缺】

时间: 2024-10-09 19:42:31

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

八大算法思想

八大算法思想分别是:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 1.比较“笨”的枚举算法思想 枚举最大的缺点是运算量比较大,解题效率不高. 如果题目的规模不是很大,在规定的时间与空间限制内能够求出解,那么最好是采用枚举法,而无须太在意是够还有更快的算法,这样可以使你有更多的时间去解答其他难题. //枚举法解决“填写运算符”的问题 import java.util.Scanner; public class meijujisuan5ge5 { public static voi

(一)八大算法思想

八大算法 八大算法:枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟算法思想. 一.枚举算法思想(暴力算法) 将问题的所有可能答案一一列举,根据判断条件判断此答案是否合适,一般用循环实现. 经典运用:百钱买百鸡.填写运算符 二.递推算法思想 1.顺推法:从已知条件出发,逐步推算出要解决问题的方法. 2.逆推法:从已知结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程. 经典运用:斐波那契数列(顺推法).银行存款(逆推法) 三.递归算法思想 1.递归过程一般通过函数或子过程实现:

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

上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来探讨一下非递归方案 实验结果令人还是有些失望,原来非递归方案的性能并不比递归方案性能高 代码如下: package com.newflypig.eightqueen; import java.util.Date; /** * 使用循环控制来实现回溯,解决N皇后 * @author [email pr

操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)

实现动态分区的分配算法. (1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配. (2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程. 模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化: 对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

Breaseman算法绘制圆形|中点算法绘制圆形_程序片段

Breaseman算法绘制圆形|中点算法绘制圆形_程序片段 1. Breaseman算法绘制圆形程序 由于算法的特殊性,限制绘制第一象限部分,其他部分通过旋转绘制. 1 void CCGProjectWorkView::bresenHam_1P4Circle(int radium, const float lineColor[]) 2 { 3 int pointX, pointY, deltD, deltHD, deltDV, direction; 4 pointX = 0; 5 pointY

最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个加权无向连通图,如何选择一个生成树,使权利的最小总和的边缘所有树,叫最小生成树. 求最小生成树算法 (1) 克鲁斯卡尔算法 图的存贮结构採用边集数组,且权值相等的边在数组中排列次序能够是随意的.该方法对于边相对照较多的不是非常有用,浪费时间. (2) p=1313">普里姆算法 图的存贮结构採用邻接矩阵.此方法是按各个顶点连通的步骤进行,须要用一个顶点集合,開始为空集,以后将以连通的顶点陆续增加到集合中,所有顶点增加集合后就得到所需的最小生成树 . 以下来详细讲下: 克鲁斯卡尔算法

趣写算法系列之--匈牙利算法(真的很好理解)

[书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(-_-

[迷宫中的算法实践]迷宫生成算法&mdash;&mdash;Prim算法

       普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场合,普里姆