`
liu86th
  • 浏览: 117906 次
  • 性别: 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>";
}

 

分享到:
评论

相关推荐

    PHP语言的几种排序算法和二分查找.pdf

    PHP语言的几种排序算法和二分查找

    PHP常用的排序和查找算法

    本文将详细探讨PHP中常用的四种排序算法——冒泡排序、快速排序、选择排序和插入排序,以及两种查找算法。 1. **冒泡排序(Bubble Sort)**: 冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较...

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

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

    PHP的排序和查找方法

    在PHP编程语言中,排序和查找是数据处理的两个核心概念。它们对于处理数组、数据库结果集等数据结构至关重要。本文将深入探讨PHP中的几种排序算法以及查找方法。 首先,让我们来了解一下PHP的四种内部排序法: 1. ...

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

    总之,本篇文章详细介绍了PHP中的冒泡排序、二分查找、顺序查找以及二维数组排序算法函数,为需要进行相关操作的读者提供了实用的代码示例和详细说明。通过学习这些基础算法和数据结构处理方法,可以提升编程能力和...

    PHP数据结构算法大全

    在PHP中,常见的算法包括排序(冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找(线性查找、二分查找)、图算法(深度优先搜索、广度优先搜索)、动态规划、贪心算法、回溯算法等。 1. **排序算法**:...

    php试题数据算法

    根据给定的文件信息,我们可以总结出一系列与PHP编程语言相关的数据结构和算法知识点,这些内容不仅涵盖了基础的数组操作,还深入到了排序算法、搜索算法以及字符串处理方面。下面,我们将逐一解析并深入探讨。 ###...

    php简单的算法类

    而`a.php`可能是另一个算法类,具体功能未知,可能包含排序、查找或其他数学问题的解决方案。 在实际应用中,我们可以实例化这些算法类,然后调用其方法来处理数据,如下所示: ```php $algorithm = new Arithmetic...

    php数据结构算法

    在上述代码中,数组被用于二分查找、顺序查找、线性表的删除以及冒泡排序和快速排序等操作。 2. **二分查找**(bin_sch函数): - 二分查找是一种高效的查找算法,适用于已排序的数组。它将目标值与数组中间元素...

    PHP算法-122014161

    PHP 算法实现查找、排序和线性表操作 本文档主要介绍了 PHP 语言中实现查找、排序和线性表操作的算法,包括二分查找、顺序查找、冒泡排序、快速排序、约瑟夫环问题等。 二分查找 二分查找是一种高效的查找算法,...

    PHP面试题之算法

    在PHP的世界里,面试题是衡量开发者技能和经验的重要手段,尤其在算法这一领域,它直接反映了开发者的逻辑思维能力和问题解决能力。算法是计算机科学的基础,对于PHP开发者来说,理解并能熟练运用各种算法至关重要。...

    数据结构和算法分析的PHP描述

    ### 数据结构和算法分析的PHP描述 #### 概述 本文档主要介绍了一些常见的数据结构和算法,并通过PHP语言来具体实现这些数据结构的操作。数据结构是指数据在计算机中的存储方式,而算法则是指对这些数据进行处理的...

    最全php经典算法.7z

    1. **排序算法**:在PHP中,常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。这些算法各有优劣,如冒泡排序和选择排序适合小规模数据,而快速排序和归并排序则适用于大规模数据,了解...

    php算法_王伟阳

    总的来说,"php算法_王伟阳"这一主题涵盖了PHP编程中的核心算法知识和实用工具,对于想要提升PHP编程能力的开发者来说,是不可或缺的学习资源。通过深入理解和实践,我们可以更好地驾驭PHP,解决实际问题,打造出...

    面试前必备(微软数据结构+算法)

    在准备面试,特别是针对微软这样的顶级科技公司的面试时,数据结构和算法是不可或缺的重要部分。这份资源"面试前必备(微软数据结构+算法)"包含了针对这类面试的100道题目,旨在帮助求职者全面了解和掌握相关知识。...

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

    冒泡排序和快速排序是两种常见的排序算法,在编程中广泛应用于数据的排序处理。在PHP中实现这两种算法同样是非常实用的技能。下面我将详细介绍这两种排序算法的实现原理以及PHP中的代码实现。 首先我们来看冒泡排序...

    php 算法大全,用 PHP 的方式实现的各类算法合集

    《PHP算法大全:掌握编程核心技巧》 ... 一、排序算法 1. 冒泡排序:通过不断交换相邻的不正确顺序元素,逐步实现整体排序。...通过实践和理解这些代码,你将能够更深入地领略PHP算法的魅力,并在实际工作中游刃有余。

    程序员必备算法知识

    1. **排序算法**:排序是编程中最常见的需求,PHP中常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序。其中,快速排序和归并排序在效率上较为突出,适用于大数据量的处理;而冒泡排序和...

Global site tag (gtag.js) - Google Analytics