算法

<?php

/**
*快速排序
*参数 array $arr
*结果 array 
*/
function quickSort($arr)
{
	//计算数组元素个数
	$len = count($arr);

	//如果只有一个元素或为空数组,直接返回该数组
	if($len <= 1)
	{
		return $arr;
	}

	//设置基准值,通常为数组的第一个元素
	$start = $arr[0];

	//初始化两个空数组
	$leftArray = array();
	$rightArray = array();

	//循环数组因为基准值为第一个元素,所以从第二个元素开始循环
	for($i=1;$i<$len;$i++)
	{
		//如果当前元素值小于基准元素就将这个元素放在左边的数组里反之则放在右边
		if($arr[$i] < $start)
		{
			$leftArray[] = $arr[$i];
		}else{
			$rightArray[] = $arr[$i];
		}
	}

	//递归的调取自身完成排序
	$leftArray = quickSort($leftArray);
	$rightArray = quickSort($rightArray);

	//合并数组
	$newArr = array_merge($leftArray,[$start],$rightArray);

	//返回拍好顺序的数组
	return $newArr;
}

/**
*冒泡排序
*参数 array $arr 
*结果 array
**/
function bubbleSort($arr)
{
	//获取数组元素个数
	$len = count($arr);

	//如果数组元素个数为1个或空数组,就返回数组本身
	if ($len <= 1) 
	{
		return $arr;
	}

	//初始化数据
	$map = '';

	//循环次数控制,因为是要用数组第一个元素与其他元素对比,所以要从第二个元素算起
	for ($i=1; $i<$len ; $i++) { 

		//对比次数控制
		for ($k=0; $k <$len - $i ; $k++) { 
			
			//如果当全部元素的值大于后一位元素的值就将他们的位置互换
			if ($arr[$k] > $arr[$k+1]) {
				$map = $arr[$k+1];
				$arr[$k+1] = $arr[$k];
				$arr[$k] = $map; 
			}
		}
	}

	//返回结果
	return $arr;
}

/**
*字符串遇到数字自动转行
*参数 string  $str
*结果 string
**/
function strOperation($str)
{
	//如果参数非字符串给出提示
	if (!is_string($str)) {
		return '数据类型错误';
	}

	//获取字符串长度
	$len = strlen($str);

	//初始化空串备用
	$newStr = '';

	//循环字符串
	for ($i=0; $i < $len; $i++)
	{ 	
		//拼接新串,如果当前元素为数字类型就换行
		if (is_numeric($str[$i]))
		{
			$newStr .= $str[$i].'<br>';
		}else{
			$newStr .= $str[$i];	
		}
	}

	//返回新的字符串
	return $newStr;
}


/**
* 递归
* @param array $array 数组
* @param int $low 数组起始元素下标
* @param int $high 数组末尾元素下标
* @param $k 要查找的元素
* @return mixed 成功时返回数组下标,失败返回-1
*/
function bin_sch($array,$low,$high,$k){

	if ($low <= $high) {

		$mid = intval(($low + $high) / 2);

		if ($array[$mid] == $k) {

			return $mid;

		} elseif ($k < $array[$mid]) {

			return bin_sch($array,$low,$mid - 1,$k);

		} else{

			return bin_sch($array,$mid + 1,$high,$k);

		}

	}

	return -1;

}



//二分搜索(折半查找)算法(前提是数组必须是有序数组) 时间复杂度是 O(logn)

$i = 0;    //存储对比的次数

//@param 待查找数组
//@param 待搜索的数字
function binsearch($arr,$num){
    $count = count($arr);
    $lower = 0;
    $high = $count - 1;
    global $i;

    while($lower <= $high){

        $i ++; //计数器

        if($arr[$lower] == $num){
            return $lower;
        }
        if($arr[$high] == $num){
            return $high;
        }

        $middle = intval(($lower + $high) / 2);
        if($num < $arr[$middle]){
            $high = $middle - 1;
        }else if($num > $arr[$middle]){
            $lower = $middle + 1;
        }else{
            return $middle;
        }
    }

    //返回-1表示查找失败
    return -1;
}

$arr = array(0,1,16,24,35,47,59,62,73,88,99);
$pos = binsearch($arr,62);
print($pos);
echo "<br>";
echo $i;















$str = 'abcd34s5d`6';

var_dump(strOperation($str));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值