<?php
//插入排序
$arr = array(123, 0, 1111,5, -1, 4, 15);
function insertSort(&$arr) {
$m = count($arr);
for($i=1;$i<$m;$i++){
$inseartValue = $arr[$i];
$index = $i-1;
//如果没找到插入未知
while ($index>=0 && $inseartValue<$arr[$index]) {
$arr[$index+1] = $arr[$index];
$index -- ;
}
//找到插入位置;
$arr[$index+1] = $inseartValue;
}
}
insertSort($arr);
//print_r($arr);
######################################################
/**
* 二分查找
*/
function binarySerch($arr,$left,$right,$v){
$mid = floor($left+$right)/2;
if($left<=$right){
if($arr[$mid] == $v){
return $mid;
}
if($arr[$mid]>$v){//在左边
return binarySerch($arr, $left, $mid-1, $v);
}else{//在右边
return binarySerch($arr, $mid+1, $right, $v);
}
}
return -1;
}
$arr = array(1,5,8,10,11,100);
$i = binarySerch($arr, 0, count($arr)-1, 1000);
//echo $i;
##############################################################################
/**
* 快速排序
*/
function quickSort($arr){
if(count($arr)<=1) return $arr;
$reference = $arr[0];
$leftArr = array();
$rigthArr = array();
for($i=1;$i<count($arr);$i++){
if($arr[$i]<=$reference){
$leftArr[] = $arr[$i];
}else{
$rigthArr[] = $arr[$i];
}
}
$leftArr = quickSort($leftArr);
$rigthArr = quickSort($rigthArr);
return array_merge($leftArr,array($reference),$rigthArr);
}
$arr = array(123, 0, 1111,5, -1, 4, 15);
$a = quickSort($arr);
#######print_r($a);
########################################################################
/*
* 冒泡排序
*/
function pupSort(&$arr){
$m = count($arr);
for ($i=0; $i <$m; $i++) {
for ($j=0; $j <$m-$i-1; $j++) {
if($arr[$j]>$arr[$j+1]){
list($arr[$j],$arr[$j+1]) = array($arr[$j+1],$arr[$j]);
}
}
}
}
$arr = array(123, 0, 1111,5, -1, 4, 15);
$a = pupSort($arr);
//print_r($arr);
#################################################
/**
* 希尔排序
* 时间复杂度为O(n3/2)
*/
function shellSort(&$arr){
$n = count($arr);
//设置步长为每次元素的一半长度
for ($gap=floor($n/2); $gap >0 ; $gap=floor($gap/2)) {
//对步长的元素进行插入排序
for($i=$gap;$i<$n;$i++){
$v = $arr[$i];
$k = $i-1;
//寻找插入位置;
while ($k>=0 && $v<$arr[$k]) {
$arr[$k+1] = $arr[$k];
$k--;
}
$arr[$k+1] = $v;
}
}
}
$arr = array(123, 0, 1111,5, -1, 1, 15);
$a = shellSort($arr);
//print_r($arr);
#####################################################################
/**
* 计数排序/桶子排序
*/
function radixSort($arr,$p=1){
$radix = 0;
$temp = array();
for($i=0;$i<count($arr);$i++){
$radix = max($radix,strlen($arr[$i]));
$index = strlen($arr[$i])>=$p ? substr($arr[$i],-$p,1) : 0;
$temp[$index][] = $arr[$i];
}
//数组重新转换
$tp = array();
for ($i=0; $i <10 ; $i++) {
if(isset($temp[$i])){
foreach($temp[$i] as $value) {
$tp[] = $value;
}
}
}
return $p <= $radix ? radixSort($tp,$p+1) : $tp;
}
$arr = array(123, 0, 1111,5, 1, 15);
$p = radixSort($arr);
//print_r($p);
###################################################################################
/**
* 堆排序
* 时间复杂度 Olog(n)
*/
//建堆
function build_heap(&$array,$i,$heapsize){
$left = $i*2+1;
$right = $left + 1;
$max = $i;
if($i < $heapsize && $left<$heapsize && $array[$left] > $array[$i] ){
$max = $left;
}
if($i < $heapsize && $right<$heapsize && $array[$right] > $array[$max]){
$max = $right;
}
if($i != $max && $i < $heapsize && $max < $heapsize){
list($array[$i],$array[$max])=array($array[$max],$array[$i]);
build_heap($array,$max,$heapsize);
}
}
function sortHeap(&$array,$heapsize){
while($heapsize){
list($array[0],$array[$heapsize-1])=array($array[$heapsize-1],$array[0]);
$heapsize = $heapsize -1;
build_heap($array,0,$heapsize);
}
}
function createHeap(&$array,$heapsize){
$i = ceil($heapsize/2)-1;
for(;$i>=0;$i--){
build_heap($array,$i,$heapsize);
}
}
function heapSort(&$array){
$heapsize = count($array);
createHeap($array,$heapsize);
sortHeap($array,$heapsize);
}
$arr = array(123, 0, 1111,5, 1, 15,29);
heapSort($arr);
//print_r($arr);
###############################################################################
/**
* 归并排序
* 时间复杂度 Θ(nlgn);
*/
#### 合并排序
function merge(&$arr,$start,$mid,$end){
$i = $start;
$j = $mid+1;
$k=0;
$ary = array();
while ($i <= $mid && $j<=$end){
if($arr[$i]<=$arr[$j]){
$ary[$k++] = $arr[$i++];
}else{
$ary[$k++] = $arr[$j++];
}
}
while($i <= $mid) {
$ary[$k++] = $arr[$i++];
}
while($j <= $end) {
$ary[$k++] = $arr[$j++];
}
for($i = 0 ;$i < $k;$i++){
$arr[$i + $start] = $ary[$i];
}
}
//分成n个片段
function mergeSort(&$array,$low,$high) {
if($low < $high) { // 任何递归都要有边界,否则就是死循环
$mid = floor(($low+$high)/ 2);
mergeSort($array,$low,$mid);
mergeSort($array,$mid+1,$high);
merge($array,$low,$mid,$high);
} else {
return ;// 这里其实可以不写,php内部默认都会自动加return的
}
}
$arr = array(123, 0, 1111,5, 1, 15,29);
mergeSort($arr,0,6);
//print_r($arr);
#############################################################
//矩阵求最长公共子串
function sub_string($str1,$str2)
{
$max = 0; //字符串最大长度
$current = 0; //记录str1的当前位置.
$str1_len = strlen($str1);
$str2_len = strlen($str2);
$arr = array();
//初始化矩阵
for($i =0;$i <$str1_len;$i++)
for($j =0; $j< $str2_len;$j++)
$arr[$i][$j] = 0;
//找出最大公约子串
for($i = 0; $i < $str1_len; $i++)
for($j = 0; $j < $str2_len; $j++)
{
if($str1[$i] == $str2[$j])
{
if ($i ==0 ||$j ==0)
$arr[$i][$j]=1;
else //在矩阵中记录,得到最长的斜线就是最大的公约子串.
$arr[$i][$j] = $arr[$i-1][$j-1]+1;
if($max < $arr[$i][$j])
{
$max = $arr[$i][$j];
$current = $i;
}
}
}
if($max == 0)
return false;
else //$current+1-$max,找到最长公约字符串的开始位置
return substr($str1,$current+1-$max,$current);
}
$str1 = "abcsdf";
$str2 = "bbcsggg";
$sub_str = sub_string($str1,$str2);
if( $sub_str != false)
echo $sub_str;
?>
php常用算法
最新推荐文章于 2021-04-12 19:52:45 发布