演算法 資料結構

2022-09-19 21:45:25 字數 3615 閱讀 4926

演算法是程式的核心,演算法的好壞直接決定了程式的好壞

基礎的幾種演算法

二分查詢

氣泡排序

插入排序

選擇排序

快速排序

二分查詢

假設資料是按公升序排序的,對於給定值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 總而言之 演算法就是解決...