當前位置:首頁 » 操作系統 » php程序演算法

php程序演算法

發布時間: 2023-02-15 02:39:28

php實現插入排序演算法

插入排序(Insertion Sort) 是一種較穩定 簡單直觀的排序演算法 插入排序的工作原理 是通過構建有序序列 對於未排序的數據 在有序序列中從後向前掃描 找到合適的位置並將其插入 插入排序 在最好情況下 時間復雜度為O(n);在最壞情況下 時間復雜度為O(n );平均時間復雜度為O(n )

插入排序示例圖

/**

* 數據結構與演算法(PHP實現) - 插入排序(Insertion Sort)。Tw.WiNGwit

*

* @author 創想編程(TOPPHP.ORG)

* @right Copyright (c) 2013 創想編程(TOPPHP.ORG) All Rights Reserved

* @license /licenses/mit-license.php MIT LICENSE

* @version 1.0.0 - Build20130613

*/

class InsertionSort {

/**

* 需要排序的數據數組。

*

* @var array

*/

private $data;

/**

* 數據數組的長度。

*

* @var integer

*/

private $size;

/**

* 數據數組是否已排序。

*

* @var boolean

*/

private $done;

/**

* 構造方法 - 初始化數據。

*

* @param array $data 需要排序的數據數組。

*/

public function __construct(array $data) {

$this->data = $data;

$this->size = count($this->data);

$this->done = FALSE;

}

/**

* 插入排序。

*/

private function sort() {

$this->done = TRUE;

for ($i = 1; $i < $this->size; ++$i) {

$current = $this->data[$i];

if ($current < $this->data[$i - 1]) {

for ($j = $i - 1; $j >= 0 && $this->data[$j] > $current; --$j) {

$this->data[$j + 1] = $this->data[$j];

}

$this->data[$j + 1] = $current;

}

}

}

/**

* 獲取排序後的數據數組。

*

* @return array 返回排序後的數據數組。

*/

public function getResult() {

if ($this->done) {

return $this->data;

}

$this->sort();

return $this->data;

}

}

?>

示例代碼 1

2

3

4

$insertion = new InsertionSort(array(9, 1, 5, 3, 2, 8, 6));

echo '

', print_r($insertion->getResult(), TRUE), '

' lishixin/Article/program/PHP/201311/20783

Ⅱ PHP 如何遞歸演算法

一般來說,類似這種遍歷輸出所有文件,大多採用遞歸演算法,這樣程序顯得比較簡潔,其實際執行效率來說,並不見得比其他方法更好。

以下是示例:

function file_list($path)
{
if ($handle = opendir($path))//打開路徑成功
{
while (false !== ($file = readdir($handle)))//循環讀取目錄中的文件名並賦值給$file
{
if ($file != "." && $file != "..")//排除當前路徑和前一路徑
{
if (is_dir($path."/".$file))
{
// echo $path.": ".$file."<br>";//去掉此行顯示的是所有的非目錄文件
file_list($path."/".$file);
}
else
{
echo $path.": ".$file."<br>";
}
}
}
}
}

Ⅲ PHP實現常見的排序演算法

註:為方便描述,下面的排序全為正序(從小到大排序)

假設有一個數組[a,b,c,d]
冒泡排序依次比較相鄰的兩個元素,如果前面的元素大於後面的元素,則兩元素交換位置;否則,位置不變。具體步驟:
1,比較a,b這兩個元素,如果a>b,則交換位置,數組變為:[b,a,c,d]
2,比較a,c這兩個元素,如果a<c,則位置不變,數組變為:[b,a,c,d]
3,比較c,d這兩個元素,如果c>d,則交換位置,數組變為:[b,a,d,c]
完成第一輪比較後,可以發現最大的數c已經排(冒)在最後面了,接著再進行第二輪比較,但第二輪比較不必比較最後一個元素了,因為最後一個元素已經是最大的了。
第二輪比較結束後,第二大的數也會冒到倒數第二的位置。
依次類推,再進行第三輪,,,
就這樣最大的數一直往後排(冒),最後完成排序。所以我們稱這種排序演算法為冒泡排序。

選擇排序是一種直觀的演算法,每一輪會選出列中最小的值,把最小值排到前面。具體步驟如下:

插入排序步驟大致如下:

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的數據,可以決定設計的選擇,減少所需時間的二次方項之可能性。

步驟:
從數列中挑出一個元素,稱為 「基準」(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。
遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

Ⅳ PHP程序演算法

用戶加入購物車 3個A and 2個B
在購物車下提示
當前使用(A+B) * 2 + A * 1 的方式可以節省多少錢

資料庫建立商品組合表
自增ID 組合名稱 組合商品ID(1,2,3,4)優惠折扣
1 測試組合 1(A商品ID),2(B商品ID) 0.99

在每次用戶確認訂單之時判斷當前加入購物車的商品是符合組合優惠
如果有則提示,沒有就略過

Ⅳ php中的取模的演算法

演算法是

90 / 22 = 4
余數是 4 所以 90對22取模之後的結果就是 4 也就是倆數相除的余數

90/22後得出4,然後再拿22乘以4得出88,再拿90減去88等於2

Ⅵ php現在有哪些常用的演算法

<?
//--------------------
// 基本數據結構演算法
//--------------------
//二分查找(數組里查找某個元素)
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;
}
//順序查找(數組里查找某個元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if( $array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
//線性表的刪除(數組中實現)
function delete_array_element($array , $i)
{
$len = count($array);
for ($j= $i; $j<$len; $j ++){
$array[$j] = $array [$j+1];
}
array_pop ($array);
return $array ;
}
//冒泡排序(數組排序)
function bubble_sort( $array)
{
$count = count( $array);
if ($count <= 0 ) return false;
for($i=0 ; $i<$count; $i ++){
for($j=$count-1 ; $j>$i; $j--){
if ($array[$j] < $array [$j-1]){
$tmp = $array[$j];
$array[$j] = $array[ $j-1];
$array [$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(數組排序)
function quick_sort($array ) {
if (count($array) <= 1) return $array;
$key = $array [0];
$left_arr = array();
$right_arr = array();
for ($i= 1; $i<count($array ); $i++){
if ($array[ $i] <= $key)
$left_arr [] = $array[$i];
else
$right_arr[] = $array[$i ];
}
$left_arr = quick_sort($left_arr );
$right_arr = quick_sort( $right_arr);
return array_merge($left_arr , array($key), $right_arr);
}

//------------------------
// PHP內置字元串函數實現
//------------------------
//字元串長度
function strlen ($str)
{
if ($str == '' ) return 0;
$count = 0;
while (1){
if ( $str[$count] != NULL){
$count++;
continue;
}else{
break;
}
}
return $count;
}
//截取子串
function substr($str, $start, $length=NULL)
{
if ($str== '' || $start>strlen($str )) return;
if (($length!=NULL) && ( $start>0) && ($length> strlen($str)-$start)) return;
if (( $length!=NULL) && ($start< 0) && ($length>strlen($str )+$start)) return;
if ($length == NULL) $length = (strlen($str ) - $start);

if ($start < 0){
for ($i=(strlen( $str)+$start); $i<(strlen ($str)+$start+$length ); $i++) {
$substr .= $str[$i];
}
}
if ($length > 0){
for ($i= $start; $i<($start+$length ); $i++) {
$substr .= $str[$i];
}
}
if ( $length < 0){
for ($i =$start; $i<(strlen( $str)+$length); $i++) {
$substr .= $str[$i ];
}
}
return $substr;
}
//字元串翻轉
function strrev($str)
{
if ($str == '') return 0 ;
for ($i=(strlen($str)- 1); $i>=0; $i --){
$rev_str .= $str[$i ];
}
return $rev_str;
}

//字元串比較
function strcmp($s1, $s2)
{
if (strlen($s1) < strlen($s2)) return -1 ;
if (strlen($s1) > strlen( $s2)) return 1;
for ($i =0; $i<strlen($s1 ); $i++){
if ($s1[ $i] == $s2[$i]){
continue;
}else{
return false;
}
}
return 0;
}

//查找字元串
function strstr($str, $substr)
{
$m = strlen($str);
$n = strlen($substr );
if ($m < $n) return false ;
for ($i=0; $i <=($m-$n+1); $i ++){
$sub = substr( $str, $i, $n);
if ( strcmp($sub, $substr) == 0) return $i;
}
return false ;
}
//字元串替換
function str_replace($substr , $newsubstr, $str)
{
$m = strlen($str);
$n = strlen($substr );
$x = strlen($newsubstr );
if (strchr($str, $substr ) == false) return false;
for ( $i=0; $i<=($m- $n+1); $i++){
$i = strchr($str, $substr);
$str = str_delete ($str, $i, $n);
$str = str_insert($str, $i, $newstr);
}
return $str ;
}

//--------------------
// 自實現字元串處理函數
//--------------------
//插入一段字元串
function str_insert($str, $i , $substr)
{
for($j=0 ; $j<$i; $j ++){
$startstr .= $str[$j ];
}
for ($j=$i; $j <strlen($str); $j ++){
$laststr .= $str[$j ];
}
$str = ($startstr . $substr . $laststr);
return $str ;
}
//刪除一段字元串
function str_delete($str , $i, $j)
{
for ( $c=0; $c<$i; $c++){
$startstr .= $str [$c];
}
for ($c=( $i+$j); $c<strlen ($str); $c++){
$laststr .= $str[$c];
}
$str = ($startstr . $laststr );
return $str;
}
//復制字元串
function strcpy($s1, $s2 )
{
if (strlen($s1)==NULL || !isset( $s2)) return;
for ($i=0 ; $i<strlen($s1); $i++){
$s2[] = $s1 [$i];
}
return $s2;
}
//連接字元串
function strcat($s1 , $s2)
{
if (!isset($s1) || !isset( $s2)) return;
$newstr = $s1 ;
for($i=0; $i <count($s); $i ++){
$newstr .= $st[$i ];
}
return $newsstr;
}
//簡單編碼函數(與php_decode函數對應)
function php_encode($str)
{
if ( $str=='' && strlen( $str)>128) return false;
for( $i=0; $i<strlen ($str); $i++){
$c = ord($str[$i ]);
if ($c>31 && $c <107) $c += 20 ;
if ($c>106 && $c <127) $c -= 75 ;
$word = chr($c );
$s .= $word;
}
return $s;
}
//簡單解碼函數(與php_encode函數對應)
function php_decode($str)
{
if ( $str=='' && strlen($str )>128) return false;
for( $i=0; $i<strlen ($str); $i++){
$c = ord($word);
if ( $c>106 && $c<127 ) $c = $c-20;
if ($c>31 && $c< 107) $c = $c+75 ;
$word = chr( $c);
$s .= $word ;
}
return $s;
}
//簡單加密函數(與php_decrypt函數對應)
function php_encrypt($str)
{
$encrypt_key = '';
$decrypt_key = '';
if ( strlen($str) == 0) return false;
for ($i=0; $i<strlen($str); $i ++){
for ($j=0; $j <strlen($encrypt_key); $j ++){
if ($str[$i] == $encrypt_key [$j]){
$enstr .= $decrypt_key[$j];
break;
}
}
}
return $enstr;
}
//簡單解密函數(與php_encrypt函數對應)
function php_decrypt($str)
{
$encrypt_key = '';
$decrypt_key = '';
if ( strlen($str) == 0) return false;
for ($i=0; $i<strlen($str); $i ++){
for ($j=0; $j <strlen($decrypt_key); $j ++){
if ($str[$i] == $decrypt_key [$j]){
$enstr .= $encrypt_key[$j];
break;
}
}
}
return $enstr;
}
?>

Ⅶ PHP演算法之猴子選大王

一群猴子要選新猴王。新猴王的選擇方法是:讓M只候選猴子圍成一圈,從某位置起順序編號為1~M號。從第1號開始報數,每輪從1報到N,凡報到N的猴子即退出圈子,接著又從緊鄰的下一隻猴子開始同樣的報數。如此不斷循環,最後剩下的一隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

請輸入猴子的數量m 11
請輸入要排除第幾個猴子n 3

7

常規做法又兩種,一種是數組,一種是鏈表,(數學方法不考慮)。對於數組方法測試了兩種思路,第一種是生成一個鍵為1-M的關聯數組,值為true,退出的鍵值為false;另一種是值為1-M的數值數組,退出的unset;結果是使用unset效率更高些。鏈表是用數組模擬的鏈表,生成鍵為1-M的關聯數組,值為下一位的鍵值,最後一位的值為1。退出了就把上一位和下一位鏈接起來。測試表明,使用鏈表的速度快於數組。

Ⅷ PHP快速排序演算法實現的原理及代碼詳解

演算法原理
下列動圖來自五分鍾學演算法,演示了快速排序演算法的原理和步驟。
步驟:
從數組中選個基準值
將數組中大於基準值的放同一邊、小於基準值的放另一邊,基準值位於中間位置
遞歸的對分列兩邊的數組再排序
代碼實現
function
quickSort($arr)
{
$len
=
count($arr);
if
($len
<=
1)
{
return
$arr;
}
$v
=
$arr[0];
$low
=
$up
=
array();
for
($i
=
1;
$i
<
$len;
++$i)
{
if
($arr[$i]
>
$v)
{
$up[]
=
$arr[$i];
}
else
{
$low[]
=
$arr[$i];
}
}
$low
=
quickSort($low);
$up
=
quickSort($up);
return
array_merge($low,
array($v),
$up);
}
測試代碼:
$startTime
=
microtime(1);
$arr
=
range(1,
10);
shuffle($arr);
echo
"before
sort:
",
implode(',
',
$arr),
"\n";
$sortArr
=
quickSort($arr);
echo
"after
sort:
",
implode(',
',
$sortArr),
"\n";
echo
"use
time:
",
microtime(1)
-
$startTime,
"s\n";
測試結果:
before
sort:
1,
7,
10,
9,
6,
3,
2,
5,
4,
8
after
sort:
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
use
time:
0.0009009838104248s
時間復雜度
快速排序的時間復雜度在最壞情況下是O(N2),平均的時間復雜度是O(N*lgN)。
這句話很好理解:假設被排序的數列中有N個數。遍歷一次的時間復雜度是O(N),需要遍歷多少次呢?至少lg(N+1)次,最多N次。
1)
為什麼最少是lg(N+1)次?快速排序是採用的分治法進行遍歷的,我們將它看作一棵二叉樹,它需要遍歷的次數就是二叉樹的深度,而根據完全二叉樹的定義,它的深度至少是lg(N+1)。因此,快速排序的遍歷次數最少是lg(N+1)次。
2)
為什麼最多是N次?這個應該非常簡單,還是將快速排序看作一棵二叉樹,它的深度最大是N。因此,快讀排序的遍歷次數最多是N次。
您可能感興趣的文章:PHP快速排序演算法實例分析PHP四種排序演算法實現及效率分析【冒泡排序,插入排序,選擇排序和快速排序】PHP排序演算法之快速排序(Quick
Sort)及其優化演算法詳解PHP遞歸實現快速排序的方法示例php
二維數組快速排序演算法的實現代碼PHP常用排序演算法實例小結【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort實例詳解

Ⅸ PHP如何實現折半查找演算法

定義:折半查找技術,也就是二分查找。它的前提是線性表中的記錄必須是關鍵碼有序(通常從大到小有序),線性表必須採用順序存儲

折半查找的基本思想:取中間記錄作為比較對象,若給定值與中間記錄的關鍵字,則在中間記錄的關鍵字相等,則查找成功;若給定值小於中間記錄的作伴去繼續查找;若給定值大於中間記錄的關鍵字,則在中間記錄的右半區繼續查找。不斷重復上述過程,直到查找成功,或所有查找區域無記錄,查找失敗為止。

實現代碼:
<?php //遞歸方式 function bin_recur_search($arr,$val){ global $time; if(count($arr) >= 1){ $mid = intval(count($arr) / 2); $time++; if($arr[$mid] == $val){ return '值為:'.$arr[$mid].'<br>查找次數:'.$time.'<br>'; }elseif($arr[$mid] > $val){ $arr = array_splice($arr,0,$mid); return bin_recur_search($arr, $val); }else{ $arr = array_slice($arr,$mid + 1); return bin_recur_search($arr, $val); } } return '未找到'.$val; } //非遞歸方式 function bin_search($arr,$val){ if(count($arr) >= 1){ $low = 0; $high = count($arr); $time = 0; while($low <= $high){ $time++; $mid = intval(($low + $high)/2); if($val == $arr[$mid]){ return '索引:'.$mid.'<br>值為:'.$arr[$mid].'<br>查找次數:'.$time; }elseif($val > $arr[$mid]){ $low = $mid + 1; }else{ $high = $mid - 1; } } } return '未找到'.$val; } $arr = array(1,3,5,7,7,9,25,68,98,145,673,8542); echo bin_recur_search($arr, 673); echo bin_search($arr, 673); ?>
運行結果:
值為:673 查找次數:4 索引:10 值為:673 查找次數:4
更多關於PHP相關內容感興趣的讀者可查看本站專題:《PHP數據結構與演算法教程》、《php程序設計演算法總結》、《php字元串(string)用法總結》、《PHP數組(Array)操作技巧大全》、《PHP常用遍歷演算法與技巧總結》及《PHP數學運算技巧總結》

Ⅹ 用php寫一個簡單的演算法

倆個數組是不對等的哈 那$arr1循環到第10次的時候我 $arr2繼續向下還是回到最初
假如從$arr1[6]開始循環 得到的是$arr1[6].$arr2[0], 那再次回到$arr1[6]時是$arr1[6].$arr2[0] 還是$arr1[6].$arr2[11]

熱點內容
伺服器版本更新是什麼意思 發布:2025-07-27 12:25:42 瀏覽:573
安卓畫畫軟體是什麼 發布:2025-07-27 12:25:40 瀏覽:642
python編程入門第3版pdf 發布:2025-07-27 12:25:04 瀏覽:870
唐燃油與h7配置哪個好 發布:2025-07-27 12:24:12 瀏覽:787
上傳圖片兼容ie8 發布:2025-07-27 12:17:45 瀏覽:550
如何配置債券賺錢 發布:2025-07-27 12:17:32 瀏覽:920
安卓主力機備用機選什麼 發布:2025-07-27 12:15:58 瀏覽:873
安卓qgc編譯開發 發布:2025-07-27 12:15:52 瀏覽:453
王者如何刪除不要的伺服器 發布:2025-07-27 12:13:45 瀏覽:605
腳本判斷是否入域 發布:2025-07-27 12:12:15 瀏覽:636