1. 程式人生 > >PHP實現基本算法代碼

PHP實現基本算法代碼

數據 ext lec key dem sse 數據結構 無數據 sch

<?

//--------------------

// 基本數據結構算法

//--------------------

//二分查找,要求數組已經排好序,首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。

//$arr array數組 $low int 數組起始元素下標 $high int 數組末尾元素下標

//$k 要查找的元素 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;

}

//選擇排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後再從剩余未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

function selectSort($array)

{

$count = count( $array );

if( $count <= 1 ) return $array;

for($i = 0; $i < $count-1; $i ++)

{

$min = $i;

for( $j = $i+1; $j < $count; $j ++)

{

if( $array[$min] > $array[$j] )

{

$min = $j;

}

}

if( $min != $i )

{

$temp = $array[$min];

$array[$min] = $array[$i];

$array[$i] = $temp;

}

}

return $array;

}

//快速排序:1.從數列中挑出一個元素,稱為"基準"。2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區結束之後,該基準就處於數列的中間位置。這個稱為分區操作。3. 遞歸地把小於基準值元素的子數列和大於基準值元素的子數列排序。

function quickSort($array){

$count = count($array);

if($count <= 1)

return $array;

$left = $right = array();

$mid_value = $array[0];

for($i = 1;$i < $count;$i++){

if($array[$i] < $mid_value){

$left[] = $array[$i];

}else{

$right[] = $array[$i];

}

}

return array_merge(quickSort($left),(array)$mid_value,quickSort($right));

}

$arr = [2,45,6,34,12,7,76,89,44,23,66,22,55];

$arr = quickSort($arr);

print_r($arr);

請使用PHP設計一個函數,對學生英語考試得分從高到低排序,輸入時所有學生的學號和考試得分,返回排好序的考試得分和對應學生的學號。考試滿分為100,得分可能會有小數,由於考試評分要求,小數位只會是0或0.5

function quick_sort(&$arr,$left,$right){

if($left < $right){

//依次取出數組的然後跟後面對比排序

$privot = $arr[$left];

$low = $left;

$high = $right;

while($low < $high){

//同後面的作比較要是小於第一個則調換到前面

while($low < $high && $arr[$high][‘score‘] >= $privot[‘score‘]){

$high--;

}

$tmp = $arr[$low];

$arr[$low] = $arr[$high];

$arr[$high] = $tmp;

//同前面的作比較若是大於後面的則調換到後面去

while($low < $high && $arr[$low][‘score‘] <= $privot[‘score‘]){

$low++;

}

$tmp = $arr[$low];

$arr[$low] = $arr[$high];

$arr[$high] = $tmp;

//以low為中間值再去回調再去排序

quick_sort($arr,$left,$low-1);

quick_sort($arr,$low+1,$right);

}

}

}

$english = array(

array(‘sid‘=>1,‘score‘=>76),

array(‘sid‘=>2,‘score‘=>93),

array(‘sid‘=>3,‘score‘=>68.5),

array(‘sid‘=>4,‘score‘=>82.5),

);

$left = 0;

$right = count($english) - 1;

quick_sort($english,$left,$right);

echo "<pre>";

print_r($english);

echo "</pre>";

//插入排序是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置插入。插入排序在實現上,通常采用in-place排序(即只需要用到O(1)的額外空間的排序),因而在從後向前掃描過程中,需要反復把已排序元素逐步向後挪位,為最新元素提供插入空間。

function insertSort($array)

{

$count = count( $array );

if( $count <= 1 ) return $array;

for($i = 1; $i < $count; $i ++)

{

$temp = $array[$i];

for($j = $i-1; $j >= 0 && $array[$j] > $temp; $j --)

{

$array[$j+1] = $array[$j];

}

$array[$j+1] = $temp;

}

return $array;

}

//順序查找(數組裏查找某個元素):

function seq_sch($arr,$k){

for($i = 0,$n = count($arr);$i < $n;$i++){

if($arr[$i] == $k){

break;

}

}

if($i < $n ){

return $i;

}else{

return -1;

}

}

//冒泡排序(數組排序):它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。

function bubble_sort($array)

{

$count = count($array);

if ($count <= 1) return false;

for($i=0; $i<$count; $i++){

for($j=1; $j<$count-$i; $j++){

if ($array[$j-1] < $array[$j]){

$tmp = $array[$j-1];

$array[$j-1] = $array[$j];

$array[$j] = $tmp;

}

}

}

return $array;

}

//線性表的刪除(數組中實現)

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;

}

//------------------------

// 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 = ‘abcdefghijklmnopqrstuvwxyz1234567890‘;

$decrypt_key = ‘ngzqtcobmuhelkpdawxfyivrsj2468021359‘;

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 = ‘abcdefghijklmnopqrstuvwxyz1234567890‘;

$decrypt_key = ‘ngzqtcobmuhelkpdawxfyivrsj2468021359‘;

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;

}

}

//單鏈表操作

#include <stdio.h>

#include <stdlib.h>

typedef char DataType;

typedef struct Node{

DataType data;

struct Node * Next;

}ListNode,* LinkList;

void Judement(LinkList head){ //判斷分配內存

if (!head){

printf("Overflow.");

exit(-1);

}

}

LinkList CreatListF(void){ //頭插法創建Single Linked List

DataType ch;

LinkList head = (ListNode*)malloc(sizeof(ListNode));

Judement(head);

ListNode* s;

ch = getchar();

while (ch != ‘\n‘){

s = (ListNode*)malloc(sizeof(ListNode));

Judement(s);

s->data = ch;

s->Next = head->Next;

head->Next = s;

ch = getchar();

}

return head;

}

LinkList CreatListS(void){ //尾插法創建Single Linked List

char ch;

ListNode* s;

LinkList head = (ListNode*)malloc(sizeof(ListNode));

Judement(head);

ch = getchar();

while (ch != ‘\n‘){

s = (ListNode*)malloc(sizeof(ListNode));

Judement(s);

s->data = ch;

head->Next = s;

head = s;

ch = getchar();

}

head->Next = NULL;

return head;

}

int GetLength(LinkList head){ //獲取長度

int length = 0;

LinkList p = head->Next;

while (p){

length += 1;

p = p->Next;

}

return length;

}

ListNode* GetNodeById(LinkList head, int i){ //依序號查找元素

if (i<1 || i>GetLength(head)){

exit(1);

}

int j=1; //防止極端情況掃描逾界

LinkList p = head->Next;

while (p != NULL && j < i){

j += 1;

p = p->Next;

}

return p;

}

ListNode* GetNodeByValue(LinkList head, DataType e){ //依值查找元素

LinkList p = head->Next;

while (p != NULL&&p->data != e){

p = p->Next;

}

return p;

}

int InsertList(LinkList head, DataType e, int i){ //插入e值在第i節點

if (i<1 || i>GetLength(head) + 1){

exit(1);

}

LinkList s = (ListNode*)malloc(sizeof(ListNode));

s->data = e;

LinkList q, p = head;

int j = 1;

while (j <= i){

q = p;

p = p->Next;

j += 1;

}

s->Next = q->Next;

q->Next = s;

return 0;

}

int DeleteListNodeById(LinkList head, int i){ //依序號刪除節點

int j = 1;

ListNode* p,* q;

if (i<1 || i>GetLength(head)){

exit(1);

}

p = head;

while (j < i){

p = p->Next;

j += 1;

}

q = p->Next;

p->Next = q->Next;

free(q);

return 0;

}

int DeleteListRepeatNode(ListNode* head){ //清除冗余數據

ListNode* p, *q, *s;

if (p == NULL){

exit(1);

}

p = head->Next; //首節點無數據

while (p->Next != NULL){

q = p;

while (q->Next != NULL){

if (q->Next->data == p->data){

s = q->Next;

q->Next = q->Next->Next;

free(s);

}

q = q->Next;

}

p = p->Next;

}

return 0;

}

PHP實現基本算法代碼