`
liu86th
  • 浏览: 113601 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[php算法]查找和排序

阅读更多
<?php

/*
 * php常用算法集合
 * 
 */

//格式化输出
function dump($obj) {
    echo '<pre>';
    print_r($obj);
    echo '</pre>';
}

//交换数据
function swap(&$a, &$b) {
    $tmp = $a;
    $a = $b;
    $b = $tmp;
}

//快速排序
function quick_sort($a) {
    if (count($a) <= 1) {
        return $a;
    }
    $l = array();
    $r = array();
    $x = $a[0];
    $c = count($a);
    for ($i = 1; $i < $c; $i++) {
        if ($a[$i] <= $x) {
            $l[] = $a[$i];
        } else {
            $r[] = $a[$i];
        }
    }
    $l = quick_sort($l);
    $r = quick_sort($r);
    return array_merge($l, array($x), $r);
}

//选择排序
function select_sort($a) {
    $n = count($a);
    for ($i = 0; $i < $n; $i++) {
        $min = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($a[$j] < $a[$min]) {
                $min = $j;
            }
        }
        swap($a[$i], $a[$min]);
    }
    return $a;
}

//插入排序
function insert_sort($a) {
    $n = count($a);
    for ($i = 1; $i < $n; $i++) {
        if ($a[$i] < $a[$i - 1]) {
            $temp = $a[$i];
            for ($j = $i - 1; (($j >= 0) && $a[$j] > $temp); $j--) {
                $a[$j + 1] = $a[$j];
            }
            $a[$j + 1] = $temp;
        }
    }
    return $a;
}

//冒泡排序
function bubble_sort($a) {
    $n = count($a);
    for ($i = 0; $i < $n; $i++) {
        for ($j = $i; $j < $n; $j++) {
            if ($a[$i] > $a[$j]) {
                swap($a[$i], $a[$j]);
            }
        }
    }
    return $a;
}

//希尔排序
function shell_sort($a) {
    $n = count($a);
    for ($gap = $n / 2; $gap > 0; $gap = intval($gap / 2)) {
        for ($i = $gap; $i < $n; $i++) { //从gap开始,  
            if ($a[$i] < $a[$i - $gap]) { //从$gap开始,每个元素与自己组内的数据进行直接插入排序    
                $temp = $a[$i];
                for ($k = $i - $gap; ($k >= 0 && $a[$k] > $temp); $k-=$gap) {
                    $a[$k + $gap] = $a[$k];
                }
                $a[$k + $gap] = $temp;
            }
        }
    }
    return $a;
}

//顺序查找
function sequential_search($a, $finded) {
    $length = count($a);
    for ($i = 0; $i < $length; $i++) {
        if ($a[$i] == $finded) {
            return $i;
        }
    }
    return -1;
}

//折半查找 || 二分查找
function half_search($a, $low, $hight, $finded) {
    while ($low <= $hight) {
        $middle = intval(($low + $hight) / 2);
        if ($a[$middle] == $finded) {
            return $middle;
        } else if ($a[$middle] < $finded) {
            $low = $middle + 1;
        } else if ($a[$middle] > $finded) {
            $hight = $middle - 1;
        }
    }
    return -1;
}

//排列组合
class Permutation {

    var $srcList;       //存放原始数列数组
    var $rstList;       //存放最终数列数组
    var $srcLen;        //原始数列的长度
    var $rstLen;        //结果数列的长度
    var $rstOrder;      //求排列或组合标志

    function Permutation($m) {
        if (!is_array($m)) {
            echo "参数类型错误:Permutation(array $m) $m为数组类型";
            return false;
        }
        $this->srcLen = count($m);
        $this->srcList = $m;
    }

    //取得排列组合结果, $order=1为取排列,$order=2为取组合
    function getList($n, $order = 1) {
        if (!is_int($n)) {
            echo "参数类型错误:getList(int $n) $n为整数类型";
            return false;
        }
        if ($n > $this->srcLen) {
            echo "要求的排列组合的长度不能大于原始数列的长度";
            return false;
        }
        $this->rstLen = $n;
        $this->rstOrder = $order;
        $this->rstList = array();
        $this->doPermutation($this->srcList, $this->rstLen);
        return $this->rstList;
    }

    //递归计算从m中取n的排列, $rst存取出的排列
    function doPermutation($m, $n, &$rst = array()) {
        //如果已经取完
        if ($n == 0) {
            $this->rstList[] = $rst;
            $rst = array();
            return true;
        }
        //从当前数列m中选取一个值,并更新数列m
        foreach ($m as $key => $value) {
            $nextM = $m;
            //判断是取排列还是组合
            switch ($this->rstOrder) {
                //取排列, 清空当前取出的值
                case 1: unset($nextM[$key]);
                    break;
                //取组合, 清空当前及前面所取的值
                case 2: array_splice($nextM, 0, $key + 1);
                    break;
                default:unset($nextM[$key]);
                    break;
            }
            $nextRst = $rst;
            //将取的值放到结果数列中
            $nextRst[] = $value;
            $this->doPermutation($nextM, $n - 1, $nextRst);
        }
    }

}

$m = array(0, 1, 2, 3, 4, 5);
$p = new Permutation($m);
$arr = $p->getList(3, 1);
foreach ($arr as $value) {
    echo implode(",", $value) . "<br>";
}

 

分享到:
评论

相关推荐

    50个优秀经典PHP算法大集合

    │ │ ├── BubbleSort.php 冒泡排序 │ │ ├── HeapSort.php 堆排序 大根堆 │ │ ├── MBaseSort.php 基数排序 MSD │ │ ├── LBaseSort.php 基数排序 LSD │ │ ├── QuickSort.php 快速排序 │ │ ...

    PHP常用的排序和查找算法

    主要介绍了PHP四种基本排序算法和两种查找算法示例,本文用一个实例讲解冒泡排序法、快速排序法、选择排序法、插入排序法的使用,需要的朋友可以参考下

    PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解

    本篇文章是对PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数进行了详细的分析介绍,需要的朋友参考下

    php排序算法(冒泡排序,快速排序)

    php排序算法代码,包括冒泡排序与快速排序,需要的朋友可以参考下

    PHP各种常见经典算法总结【排序、查找、翻转等】

    主要介绍了PHP各种常见经典算法,结合实例形式总结分析了php排序、查找、翻转等算法相关实现技巧,需要的朋友可以参考下

    PHP排序算法之堆排序(Heap Sort)实例详解

    本文实例讲述了PHP排序算法之堆排序(Heap Sort)。分享给大家供大家参考,具体如下: 算法引进: 在这里我直接引用《大话数据结构》里面的开头: 在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的...

    php常用算法(doc)

    这里是用PHP写的几个基础算法,算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C...

    基于C#语言的查找、排序算法以及23设计模式的汇总.zip

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...

    PHP实现排序堆排序(Heap Sort)算法

    在前面讲到 简单选择排序 ,它在待排序的 n 个记录中选择一个最小的记录需要比较 n – 1 次,本来这也可以理解,查找第一个数据需要比较这么多次是正常的,否则如何知道他是最小的记录。 可惜的是,这样的操作并没有...

    php经典算法集锦

    主要介绍了php经典算法,实例分析了汉诺塔、排序、查找、递归等算法技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    PHP经典算法集锦【经典收藏】

    主要介绍了PHP经典算法集锦,整理了各种常见的算法,包括排序、查找、遍历、运算等各种常见算法原理与实现技巧,需要的朋友可以参考下

    [源代码]Python算法详解.rar

    )收藏评论(0)举报资料介绍基于Python分别讲解了算法是程序的灵魂,数据结构,常用的算法思想,线性表、队列和栈,树,图,查找算法,内部排序算法,经典的数据结构问题,解决数学问题,经典算法问题,解决图像问题...

    php小技巧 把数组的键和值交换形成了新的数组,查找值取得键

    复制代码 代码如下: $cityname =...array()、array_search()、array_key_exists()使用实例php冒泡排序、快速排序、快速查找、二维数组去重实例分享PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解解析php二

    PHP折半(二分)查找算法实例分析

    本文实例讲述了PHP折半(二分)查找算法。分享给大家供大家参考,具体如下: 折半查询只适用于已经按照正序或者逆序排序的数组,字符串等; 算法: 先取数组的中间位置,无中间位置,则向下取整; 从中间进行折半,...

    php 冒泡排序 交换排序法

    复制代码 代码如下: $a=array(’11’,’2′,’13’,’... 您可能感兴趣的文章:php数组冒泡排序算法实例php冒泡排序与快速排序实例详解又一个PHP实现的冒泡排序算法分享php冒泡排序、快速排序、快速查找、二维数组去重实

    PHP 二维数组根据某个字段排序的具体实现

    因此翻看 PHP 手册查找到了如下方法,做此笔记。废话少说,奉上代码,清单如下: 复制代码 代码如下: &lt;?php /** * 二维数组根据某个字段排序 * 功能:按照用户的年龄倒序排序 * @author ruxing.li */ header(...

Global site tag (gtag.js) - Google Analytics