程式設計師必備演算法 最考驗邏輯思維能力的十大基礎演算法

2021-07-10 07:47:14 字數 1958 閱讀 2273

最考驗邏輯思維能力的十大基礎演算法

程式設計師必須知道的10大基礎實用演算法以及講解,想要從猿進化為獅,就來看看吧。

演算法一:快速排序演算法

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。

演算法步驟:

1 從數列中挑出乙個元素,稱為 「基準」(pivot),

2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

3 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。

sorting_quicksort_anim

詳細介紹:快速排序

演算法二:堆排序演算法

堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

堆排序的平均時間複雜度為ο(nlogn) 。

演算法步驟:

建立乙個堆h[0..n-1]

把堆首(最大值)和堆尾互換

3. 把堆的尺寸縮小1,並呼叫shift_down(0),目的是把新的陣列頂端資料調整到相應位置

重複步驟2,直到堆的尺寸為1

sorting_heapsort_anim

詳細介紹:堆排序

演算法三:歸併排序

歸併排序(merge sort,台灣譯作:合併排序)是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

演算法步驟:

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列

設定兩個指標,最初位置分別為兩個已經排序序列的起始位置

比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置

重複步驟3直到某一指標達到序列尾

將另一串行剩下的所有元素直接複製到合併序列尾

merge_sort_animation2

詳細介紹:歸併排序

演算法四:二分查詢演算法

二分查詢演算法是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。折半搜尋每次把搜尋區域減少一半,時間複雜度為ο(logn) 。

詳細介紹:二分查詢演算法

演算法五:bfprt(線性查詢演算法)

bfprt演算法解決的問題十分經典,即從某n個元素的序列中選出第k大(第k小)的元素,通過巧妙的分析,bfprt可以保證在最壞情況下仍為線性時間複雜度。該演算法的思想與快速排序思想相似,當然,為使得演算法在最壞情況下,依然能達到o(n)的時間複雜度,五位演算法作者做了精妙的處理。

演算法步驟:

將n個元素每5個一組,分成n/5(上界)組。

取出每一組的中位數,任意排序方法,比如插入排序。

遞迴的呼叫selection演算法查詢上一步中所有中位數的中位數,設為x,偶數個中位數的情況下設定為選取中間小的乙個。

用x來分割陣列,設小於等於x的個數為k,大於x的個數即為n-k。

若i==k,返回x;若i

程式設計師的寫作能力 邏輯思維

既然我那篇都提到寫東西了,那這篇就談談 程式設計師的寫作能力 大家不要誤會,我在這邊說的 寫作能力,寫點東西 也好,不是說寫 寫散文,寫劇本的能力。我想表達的只是寫作能力中最基本的一種 寫出清晰 樸素 有思想的文章的能力。其實除了算是比較好的之外,我見過大量的部落格寫出來的都是些無病呻吟的心情日記而...

程式設計師必備75道邏輯思維題(附答案)之二

身為乙個大資料工程師,平時的演算法訓練還是不能少的,今天給大家看幾道我曾經看到的邏輯思維題覺得很好,想分享一下。乙個球 一把長度大約是球的直徑2 3長度的直尺.你怎樣測出球的半徑?方法很多,看看誰的比較巧妙 五個大小相同的一元人民幣硬幣。要求兩兩相接觸,應該怎麼擺?猜牌問題 s先生 p先生 q先生他...

75道程式設計師邏輯思維面試題

假設有乙個池塘,裡面有無窮多的水。現有2個空水壺,容積分別為5公升和6公升。問題是如何只用這2個水壺從池塘裡取得3公升的水。周雯的媽媽是豫林水泥廠的化驗員。一天,周雯來到化驗室做作業。做完後想出去玩。等等,媽媽還要考你乙個題目,她接著說,你看這6只做化驗用的玻璃杯,前面3只盛滿了水,後面3只是空的。...