差不多把資料結構裡面的主要演算法都寫了,寫乙個概要吧。
1,陣列
有序陣列與無序陣列的刪除,插入,查詢操作,時間複雜度,很簡單:
2,簡單排序
時間複雜度在o(n^2)級別的,雖然都是平方級別的,但也有快慢之分:
一般來說: 插入 > 選擇 > 冒泡
冒泡:不變性:在排序過程中,已排好的那部分(即冒泡到的最終位置就是排序好的最終位置)保持不變,不參與後來的排序
效率:要進行(n-1) + (n-2) +,,,+1 = n(n-1)/2 ,約在n^2 / 2 的比較,假設有一半情況需要交換,則需要n^2 / 4次的交換
選擇:不變性:已選擇好的那一段不參與排序,位置選好後就不變
效率:和冒泡一樣,進行n(n-1)/2次比較,但它無疑比冒泡快,因為它進行的交換要少得多(想想為什麼!因為選擇排序只在一趟結束的時候才交換1次)
插入:不變性:已插入部分區域性有序(但不是位置保持不變,跟上面的有區別)
效率:最壞情況下,才1 + 2 + (n-1) = n(n-1)/2 次比較(逆序的時候),平均是n(n-1)/ 4. 元素的移動次數跟比較次數一樣。
插入排序是從區域性有序向全域性有序擴充套件的過程。
3,棧和佇列
棧和佇列作為一種工具,就是提供了受限訪問的功能。
入棧出棧,進隊出隊時間複雜度均為o(1)
迴圈佇列--已經寫過
雙端佇列---在兩頭進行刪除和插入
優先順序佇列---優先順序佇列是指在普通佇列的基礎上,給佇列中的元素增加了優先順序屬性(也可以看做是有序屬性)的佇列,顯然,進隊就要插入到適合的位置,而不是隊尾,出隊永遠是出對頭最小(可以說是優先順序最高)的元素。用陣列或者鏈式實現插入需要o(n)時間,刪除o(1)時間。
在學了堆以後,可以用堆來實現優先順序佇列,堆排序等等。
4,鍊錶
單鏈表:只在表頭記錄first指標
雙端鍊錶:在表尾再記錄乙個last指標。
用鍊錶實現棧,用鍊錶實現佇列。---資料型別和抽象!!!
有序鍊錶(也可以用來實現優先順序佇列)
雙向鍊錶
實現都複雜度分析都不難,不一一枚舉
5,遞迴
任何乙個使用遞迴的程式都可以轉化成乙個使用棧的程式,然而,在實踐中,人們往往從一開始就思考基於棧的演算法,而不是從遞迴轉化。
通常情況下,遞迴的方法,或是使用棧,或者是乙個迴圈,哪個更有效就使用哪個
6,高階排序
shell排序:
對插入排序的改進,插入排序複製的次數太多(元素往後移動)
n-增量排序,shell排序通過增加插入排序時候的間隔,來進行插入排序,
減小間隔,知道間隔為1,完成shell排序,每次間隔的關係可以通過h = 3 * h + 1來變化,當然也可以選擇其他的變化方式
效率:除了在一些特殊的情況下,目前還沒有人能在理論上去分析shell排序的複雜度,有各種基於實驗的評估估計在o(n^1.5)左右。
快速排序:
目前發現的最快的排序方法,可以遞迴實現
效率:o(n*logn),對逆序陣列排序,會降到o(n^2)
歸併排序:
o(n*logn) 可以遞迴實現
基數排序(桶排序),乙個很有意思的排序方法,還沒有去寫,有時間寫一下
7,二叉樹
二叉查詢樹里的查詢,刪除,插入都是log(n)級別的,easy
用二叉排序樹來實現有序鍊錶
8,堆
效率分析:
插入:logn
刪除最小值:logn,注意刪除只要一下,這個logn是後續的調整
堆排序:刪除乙個是logn,連續刪除n個(對n個數排序)為nlogn
9,圖最近寫的
鄰接矩陣 鄰接表 拓撲排序 最小生成樹 等等
演算法 基本資料結構
1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...
php 基本資料結構 和 演算法
以下的格式不好看,或者到空間的 裡面看吧,那裡的格式規範些。希望對有需要的同學有點幫助吧 基本資料結構 二分查詢 有序陣列裡查詢某個元素 low為待查詢的陣列中的最小值,high為陣列中的最大值,k為要查詢的關鍵字 function bin sch array,low,high,k elseif k...
面試基本資料結構和演算法
2.二叉樹 3.鍊錶反轉 def quick sort li,start,end 分治 一分為二 start end 證明要處理的資料只有乙個 start end 證明右邊沒有資料 if start end return 定義兩個游標,分別指向0和末尾位置 left start right end ...