php 实现各种经典算法

//--------------------  
// 基本数据结构算法 
//--------------------  
//二分查找(数组里查找某个元素)

 1 function bin_sch($array,  $low,  $high, $k){
 2     if ( $low <= $high){
 3         $mid =  intval(($low+$high)/2 );
 4         if ($array[$mid] ==  $k){
 5             return $mid;
 6         } elseif ( $k < $array[$mid]){
 7             return  bin_sch($array,  $low,  $mid-1,  $k);
 8         } else {
 9             return  bin_sch($array,  $mid+ 1,  $high,  $k);
10         }
11     }
12     return -1;
13 }   

//顺序查找(数组里查找某个元素)

 1 function  seq_sch($array, $n,  $k){
 2     $array[$n] =  $k;
 3     for ($i=0;  $i<$n;  $i++){
 4         if( $array[$i] == $k){
 5             break;
 6         }
 7     }
 8     if  ($i<$n){
 9         return  $i;
10     } else {
11         return -1;
12     }
13 }   

//线性表的删除(数组中实现)

1 function delete_array_element($array ,  $i)
2 {
3         $len =  count($array);
4         for ($j= $i; $j<$len; $j ++){
5                 $array[$j] = $array [$j+1];
6         }
7         array_pop ($array);
8         return $array ;
9 } 

//冒泡排序(数组排序)

思路:?每次循环排列出一个最大的数

(一)

 1 function bubble_sort( $array)
 2 {
 3         $count = count( $array);
 4         if ($count <= 0 ) return false;
 5         for($i=0 ; $i<$count; $i ++){
 6                 for($j=$count-1 ; $j>$i; $j--){
 7                         if ($array[$j] < $array [$j-1]){
 8                                  $tmp = $array[$j];
 9                                  $array[$j] = $array[ $j-1];
10                                 $array [$j-1] = $tmp;
11                         }
12                 }
13         }
14         return $array;
15 }  

(二)

//快速排序(数组排序)

思路:先对数组进行分割, 把大的元素数值放到一个临时数组里,把小的元素数值放到另一个临时数组里(这个分割的点可以是数组中的任意一个元素值,一般用第一个元素,即$array[0]),然后继续把这两个临时数组重复上面拆分,最后把小的数组元素和大的数组元素合并起来。这里用到了递归的思想。

(一)

 1 function quick_sort($array ) {
 2         if (count($array) <= 1) return  $array;
 3         $key = $array [0];
 4         $left_arr  = array();
 5         $right_arr = array();
 6         for ($i= 1; $i<count($array ); $i++){
 7                 if ($array[ $i] <= $key)
 8                         $left_arr [] = $array[$i];
 9                 else
10                          $right_arr[] = $array[$i ];
11         }
12         $left_arr = quick_sort($left_arr );
13         $right_arr = quick_sort( $right_arr);
14         return array_merge($left_arr , array($key), $right_arr);
15 }  

(二)

//选择排序 
?思路:每一趟在n-i+1(i = 1,2,…,n-1)个记录中选择关键字最小的记录作为有序序列中第i个记录,其中最简单的是简单选择排序,其过程如下:通过n-i次关键字间的比较,从n-i+1个记录中选择出关键字最小的记录,并各第i个记录交换之。 

//插入排序 
思路:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间 

//------------------------  
// PHP内置字符串函数实现  
//------------------------  
//字符串长度

 1 function strlen ($str)
 2 {
 3         if ($str == ‘‘ ) return 0;
 4         $count =  0;
 5         while (1){
 6                 if ( $str[$count] != NULL){
 7                          $count++;
 8                         continue;
 9                 }else{
10                         break;
11                 }
12         }
13         return $count;
14 }  

//截取子串

 1 function substr($str, $start,  $length=NULL)
 2 {
 3         if ($str== ‘‘ || $start>strlen($str )) return;
 4         if (($length!=NULL) && ( $start>0) && ($length> strlen($str)-$start)) return;
 5         if (( $length!=NULL) && ($start< 0) && ($length>strlen($str )+$start)) return;
 6         if ($length ==  NULL) $length = (strlen($str ) - $start);
 7
 8         if ($start <  0){
 9                 for ($i=(strlen( $str)+$start); $i<(strlen ($str)+$start+$length ); $i++) {
10                         $substr .=  $str[$i];
11                 }
12         }
13         if ($length  > 0){
14                 for ($i= $start; $i<($start+$length ); $i++) {
15                         $substr  .= $str[$i];
16                 }
17         }
18         if ( $length < 0){
19                 for ($i =$start; $i<(strlen( $str)+$length); $i++) {
20                         $substr .= $str[$i ];
21                 }
22         }
23         return $substr;
24 }  

//字符串翻转

function strrev($str)
{
        if ($str == ‘‘) return 0 ;
        for ($i=(strlen($str)- 1); $i>=0; $i --){
                $rev_str .= $str[$i ];
        }
        return $rev_str;
}  

//字符串比较

 1 function strcmp($s1,  $s2)
 2 {
 3         if (strlen($s1) <  strlen($s2)) return -1 ;
 4         if (strlen($s1) > strlen( $s2)) return 1;
 5         for ($i =0; $i<strlen($s1 ); $i++){
 6                 if ($s1[ $i] == $s2[$i]){
 7                         continue;
 8                 }else{
 9                         return false;
10                 }
11         }
12         return  0;
13 }  

//查找字符串

 1 function  strstr($str, $substr)
 2 {
 3          $m = strlen($str);
 4         $n = strlen($substr );
 5         if ($m < $n) return false ;
 6         for ($i=0; $i <=($m-$n+1); $i ++){
 7                 $sub = substr( $str, $i, $n);
 8                 if ( strcmp($sub, $substr) ==  0)  return $i;
 9         }
10         return false ;
11 }  

//字符串替换

 1 function str_replace($substr , $newsubstr, $str)
 2 {
 3          $m = strlen($str);
 4         $n = strlen($substr );
 5         $x = strlen($newsubstr );
 6         if (strchr($str, $substr ) == false) return false;
 7         for ( $i=0; $i<=($m- $n+1); $i++){
 8                  $i = strchr($str,  $substr);
 9                 $str = str_delete ($str, $i, $n);
10                 $str = str_insert($str,  $i, $newstr);
11         }
12         return $str ;
13 }  

//--------------------  
// 自实现字符串处理函数 
//--------------------  
//插入一段字符串

 1 function str_insert($str, $i , $substr)
 2 {
 3         for($j=0 ; $j<$i; $j ++){
 4                 $startstr .= $str[$j ];
 5         }
 6         for ($j=$i; $j <strlen($str); $j ++){
 7                 $laststr .= $str[$j ];
 8         }
 9         $str = ($startstr . $substr  . $laststr);
10         return $str ;
11 }  

//删除一段字符串

 1 function str_delete($str , $i, $j)
 2 {
 3         for ( $c=0; $c<$i;  $c++){
 4                 $startstr .= $str [$c];
 5         }
 6         for ($c=( $i+$j); $c<strlen ($str); $c++){
 7                 $laststr  .= $str[$c];
 8         }
 9          $str = ($startstr . $laststr );
10         return $str;
11 }  

//复制字符串

1 function strcpy($s1, $s2 )
2 {
3         if (strlen($s1)==NULL || !isset( $s2)) return;
4         for ($i=0 ; $i<strlen($s1);  $i++){
5                 $s2[] = $s1 [$i];
6         }
7         return $s2;
8 }  

//连接字符串

1 function strcat($s1 , $s2)
2 {
3         if (!isset($s1) || !isset( $s2)) return;
4         $newstr = $s1 ;
5         for($i=0; $i <count($s); $i ++){
6                 $newstr .= $st[$i ];
7         }
8         return $newsstr;
9 }  

//简单编码函数(与php_decode函数对应)

 1 function php_encode($str)
 2 {
 3         if ( $str==‘‘ && strlen( $str)>128) return false;
 4         for( $i=0; $i<strlen ($str); $i++){
 5                  $c = ord($str[$i ]);
 6                 if ($c>31 && $c <107) $c += 20 ;
 7                 if ($c>106 && $c <127) $c -= 75 ;
 8                 $word = chr($c );
 9                 $s .= $word;
10         }
11         return $s;
12 }  

//简单解码函数(与php_encode函数对应)

 1 function php_decode($str)
 2 {
 3         if ( $str==‘‘ && strlen($str )>128) return false;
 4         for( $i=0; $i<strlen ($str); $i++){
 5                 $c  = ord($word);
 6                 if ( $c>106 && $c<127 ) $c = $c-20;
 7                 if ($c>31 && $c< 107) $c = $c+75 ;
 8                 $word = chr( $c);
 9                 $s .= $word ;
10         }
11         return $s;
12 }  

//简单加密函数(与php_decrypt函数对应)

 1 function php_encrypt($str)
 2 {
 3          $encrypt_key = ‘abcdefghijklmnopqrstuvwxyz1234567890‘;
 4          $decrypt_key = ‘ngzqtcobmuhelkpdawxfyivrsj2468021359‘;
 5         if ( strlen($str) == 0) return  false;
 6         for ($i=0;  $i<strlen($str); $i ++){
 7                 for ($j=0; $j <strlen($encrypt_key); $j ++){
 8                         if ($str[$i] == $encrypt_key [$j]){
 9                                 $enstr .=  $decrypt_key[$j];
10                                 break;
11                         }
12                 }
13         }
14         return $enstr;
15 }  

//简单解密函数(与php_encrypt函数对应)

 1 function php_decrypt($str)
 2 {
 3          $encrypt_key = ‘abcdefghijklmnopqrstuvwxyz1234567890‘;
 4          $decrypt_key = ‘ngzqtcobmuhelkpdawxfyivrsj2468021359‘;
 5         if ( strlen($str) == 0) return  false;
 6         for ($i=0;  $i<strlen($str); $i ++){
 7                 for ($j=0; $j <strlen($decrypt_key); $j ++){
 8                         if ($str[$i] == $decrypt_key [$j]){
 9                                 $enstr .=  $encrypt_key[$j];
10                                 break;
11                         }
12                 }
13         }
14         return $enstr;
15 }  

转载自 http://www.cnblogs.com/hellohell/p/5718175.html

时间: 2024-10-12 21:37:24

php 实现各种经典算法的相关文章

数据挖掘十大经典算法

一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2) 在树构造过程中进行剪枝: 3) 能够完成对连续属性的离散化处理: 4) 能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导

动态展示十大经典算法

算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divideandconquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1.从数列中挑出一个元素,称为“基准”(pivot),

数据挖掘领域十大经典算法初探

译者:July   二零一一年一月十五日 ----------------------------------------- 参考文献:国际权威的学术组织ICDM,于06年12月年评选出的数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.==============博主说明:1.原文献非最新文章,只是本人向来对算法比较敏感.感兴趣,便把原文细看了下,翻译过程中

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

三白话经典算法系列 Shell排序实现

山是包插入的精髓排序排序.这种方法,也被称为窄增量排序,因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 由于直接插入排序在元素基本有序的情况下(接近最好情况),效率是非常高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97

白话经典算法系列之四 直接选择排序及交换二个数据的正确实现

分类: 白话经典算法系列 2011-08-09 11:15 16682人阅读 评论(29) 收藏 举报 算法面试c 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后. 设数组为a[0…n-1]. 1.      初始时,数组全为无序区为a[0..n-1].令i=0 2.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交

白话经典算法系列之七 堆与堆排序

堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值. 2.每一个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于不论什么一个子节点的键值时为最大堆.当父结点的键值总是小于或等于不论什么一个子节点的键值时为最小堆.下图展示一个最小堆

【从零学习经典算法系列】分治策略实例——二分查找

1.二分查找算法简介 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半.折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn). 二分查找的优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且

24点经典算法

1.概述 给定4个整数,当中每一个数字仅仅能使用一次:随意使用 + - * / ( ) ,构造出一个表达式,使得终于结果为24,这就是常见的算24点的游戏.这方面的程序非常多,一般都是穷举求解.本文介绍一种典型的算24点的程序算法,并给出两个详细的算24点的程序:一个是面向过程的C实现,一个是面向对象的java实现. 2.基本原理 基本原理是穷举4个整数全部可能的表达式,然后对表达式求值. 表达式的定义: expression = (expression|number) operator (ex

【转】聚类分析经典算法讲解及实现

本文将系统的讲解数据挖掘领域的经典聚类算法,并给予代码实现示例.虽然当下已有很多平台都集成了数据挖掘领域的经典算法模块,但笔者认为要深入理解算法的核心,剖析算法的执行过程,那么通过代码的实现及运行结果来进行算法的验证,这样的过程是很有必要的.因此本文,将有助于读者对经典聚类算法的深入学习与理解. 4 评论 杨 翔宇, 资深软件工程师, IBM 段 伟玮, 在读博士, IBM 2016 年 7 月 18 日 内容 在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 前言