PHP實現基本算法代碼
<?
//--------------------
// 基本數據結構算法
//--------------------
//二分查找,要求數組已經排好序,首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。
//$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實現基本算法代碼