演算法是程式的核心,演算法的好壞直接決定了程式的好壞
基礎的幾種演算法
二分查詢
氣泡排序
插入排序
選擇排序
快速排序
二分查詢
假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功;若x小於當前位置值,則在數列的前半段中查詢;若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止。(資料量大的時候使用)
//二分查詢
function bin_search($arr,$low,$high,$k)
else if($k < $arr[$mid])
else
}return -1;
}$arr = array(1,2,3,4,5,6,7,8,9,10);
print(bin_search($arr,0,9,3));
氣泡排序
氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,依次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
步驟:1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3.針對所有的元素重複以上的步驟,除了最後乙個。
4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//氣泡排序
function bubblesort($arr) }}
return $arr;
}$arr = bubblesort($arr);
print_r($arr);
選擇排序
選擇排序(selection sort)是一種簡單直觀的排序演算法。
1.首先在未排序序列中找到最小元素,存放到排序序列的起始位置,
2.然後,再從剩餘未排序元素中繼續尋找最小元素,
3.然後放到排序序列末尾。
4.以此類推,直到所有元素均排序完畢。
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//選擇排序
//實現思路 雙重迴圈完成,外層控制輪數,當前的最小值。內層控制比較次數
function selectsort($arr)
//已經確定了當前的最小值的位置,儲存到$p中。
//如果發現 最小值的位置與當前假設的位置$i不同,則位置互換即可
if ($p != $i)
}//返回最終結果
return $arr;
}$arr = selectsort($arr);
print_r($arr);
插入排序
插入排序(insertion sort)的演算法描述是一種簡單直觀的排序演算法。
它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。
步驟:1.從第乙個元素開始,該元素可以認為已經被排序
2.取出下乙個元素,在已經排序的元素序列中從後向前掃瞄
3.如果該元素(已排序)大於新元素,將該元素移到下一位置
4.重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
5.將新元素插入到該位置中
6.重複步驟2
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//插入排序
function insert_sort($arr)
else }}
//將這個元素 插入到已經排序好的序列內。
//返回
return $arr;
}$arr = insert_sort($arr);
print_r($arr);
快速排序
快速排序是由東尼·霍爾所發展的一種排序演算法。
在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。
事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。
步驟:1.從數列中挑出乙個元素,稱為 「基準」(pivot),
2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
3.遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//快速排序
function quick_sort($arr)
else
}//遞迴呼叫
$left=quick_sort($left);
$right=quick_sort($right);
//將所有的結果合併
return array_merge($left,array($arr[0]),$right);
}$arr = quick_sort($arr);
print_r($arr);
歸併排序
利用遞迴,先拆分、後合併、再排序。
步驟:均分數列為兩個子數列
遞迴重複上一步驟,直到子數列只有乙個元素
父數列合併兩個子數列並排序,遞迴返回數列
spl,指spl - standard php library 標準php類庫。
雙向鍊錶
雙鏈表 (dll) 是乙個鏈結到兩個方向的節點列表。當底層結構是 dll 時, 迭代器的操作、對兩端的訪問、節點的新增或刪除都具有 o (1) 的開銷。因此, 它為棧和佇列提供了乙個合適的實現。
spldoublylinkedlist
splstack
splqueue
堆堆是遵循堆屬性的樹狀結構: 每個節點都大於或等於其子級, 使用對堆全域性的已實現的比較方法進行比較。
splheap
splmaxheap
splminheap
splpriorityqueue
陣列陣列是以連續方式儲存資料的結構, 可通過索引進行訪問。不要將它們與 php 陣列混淆: php 陣列實際上是按照有序的列表實現的。
splfixedarray
對映對映是乙個資料擁有鍵值對。php 陣列可以被看作是從整數/字串到值的對映。spl 提供了從物件到資料的對映。此對映也可用作物件集。
splobjectstorage
演算法(資料結構)
空間不夠儲存 給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 40億個數空間儲存的問題 利用對映 分析 unsigned 範圍是2 32 40億大約大約4g個數不到,常規方法肯定是不行的 我們你可以利用 伴隨陣列 那種思想利用記...
查詢演算法 資料結構
查詢演算法總體分為靜態查詢,和動態查詢,其中靜態查詢法,不改變查詢表結構,動態查詢表,可以進行插入和刪除操作。一 查詢的基本概念 查詢,也可稱檢索,是在大量的資料元素中找到某個特定的資料元素而進行的工作。查詢是一種操作。二 順序查詢 針對無序序列的一種最簡單的查詢方式。時間複雜度為o n 三 折半查...
初識演算法 資料結構
需求驅動 what why how 所有的學習從需求開始,學習任何知識要想事半功倍,一定要先搞清楚它存在的意義和價值 目錄 1 什麼是演算法?2 演算法好壞的評判標準 2.1 時間複雜度 流程決定 2.2 額外空間複雜度 流程決定 2.3 常數項時間 實現細節決定 what 總而言之 演算法就是解決...