標籤:

數據結構的那些排序演算法總是記不住,這個真的背的嗎?


理解的基礎上歸下類,記下每種特點就行了,還是挺直觀的。下面就以常用的六個排序演算法(升序)為例說下特點。

三種n^2的:冒泡,選擇和插入。

冒泡:目的,每次排好最後一個。方式,從第一個開始查看相鄰倆,不合適(前面的大)就交換,這樣最後一個一定是最大的。

然後,數組元素減一(最後一個排好了扔了吧),縮小規模再來一次。

選擇:每次從待選數組中拎出一個最大的來,放到最後,然後縮小規模再來一次。

插入:假設後面的序列是有序的,每次從剩餘數組中拎出最後一個,插入到有序數組中合適位置。然後剩餘數組縮小規模再插一次。

三種nlgn的:快排,歸併和堆排。

快排:每次隨便選一個,把它整合適了(放到最終有序數組正確位置),然後比他小的扔左邊,比他大的扔右邊。然後除掉該數字外的左右子數組各自縮小規模再來一次。

歸併:隨便找個位置,砍成兩半。這兩半各自縮小規模了吧,然後假設他們自己來了好多次排好了。最後合併這倆有序數組就行。

堆排:這個比較有意思,核心要實現一個堆化函數。這個函數什麼意思呢,就是假設一個大頂堆只有根元素不合法,左右子樹都合法(符合堆性質),然後把堆頂元素一路往下搞,跟冒泡差不多,使整個樹滿足堆的性質。

然後呢,把整個數組搞成符合堆的性質(自底而上,從第一個有孩子的元素一直調用堆化函數搞到根元素),把第一個(堆頂,即最大元素)和最後一個交換。如此一來,規模縮小一個,再來一次(堆化&交換)。

其他還有shell排啦,桶排啦。不急,消化了這六個再說。


死記硬背記不住,你可以一遍又一遍地使用他們,也可以記住。但是歸根結底,都是靠背誦。


Coding 百遍,其義自現。 —— 忘了出處

不是靠記,而是靠實踐。在學某個演算法的時候如果實在想不通,可以先看一部分提示和說明,然後自己去思考下一步怎麼做,只要做出來了,八九不離十吧,關鍵是印象更深。揣測一個演算法背後的思想(別人是怎麼想到的?),有利於提高解決問題的能力(舉一反三)。


要背。在你智商不足以只理解思路然後就能完成具體實現的情況下,還想讓自己看起來很牛逼的話,必須背。具體怎麼背,如輪子哥所說。一遍一遍用。用到感覺就像1+1=2一樣熟悉就好了。

就醬。

PS。不要糾結自己是死記硬背的還是根據思路寫出來的,只要看起來和別人一樣牛逼就行了。


這應該是困擾很多人的問題,其實是不需要背的,你需要深入理解演算法的原理,然後能掌握一門可以實現數據結構的語言的基本語法,就能自己將其轉換為代碼實現這些演算法。往往以下兩種情況是障礙,一種是根本不深入理解演算法,這無能為力,另一種是不知道如何將大腦中的演算法框架轉換成代碼實現,這是編程功底不深,據我所知,第二種居多。數據結構是服務於編程的,但是很多人都走偏了。


這個網站,用互動式動畫演示各種數據結構

VisuAlgo - visualising data structures and algorithms through animation


讀書百遍其義自見。


數據結構真的不該靠死記,首先死記你已經排斥它了才會去死記吧,所以別這麼做。

就排序這一類演算法,其實不難你第一得用代碼過幾遍,理解它然後每種演算法的原理都盡量做到有自己的一個看法,這可以潛移默化中記住它而且記得很深,然而這並不是主要的,一定要有自己對這些演算法的獨特見解,一定要有,一定要有,一定要有!

上述你能做到,代碼也就蹭蹭蹭出來了,完全不用死記啊,輪子哥說的其實是一個道理,因為多熟悉幾遍你只要不笨自然可以有自己的看法,有自己的看法好處不單單是記住,你還能自然而然的了解每種演算法誰的穩定誰不穩定,哪個高效哪個相對沒那麼高效,這才深刻掌握一個知識點。

主要是靠自己的獨有的看法去理解演算法,什麼才叫理解演算法?並不是知道它原理就行,這最多是偽理解,你知道原理後,加上有對這個演算法獨到的見解才算真的理解。

反正我是這麼做的,屢試不爽!!不算技巧的技巧哈


想想高數裡面學的那些數學公式, 做題時你知道該用哪個公式, 也能輕易默寫出那個公式, 但未必能立馬想出公式是怎麼推導出來的. 演算法也是這樣吧, 其實用多了的話就算你不刻意去背也自然記住了.

但你必須第一次切實的自己去推導出來, 以後才好直接拿來用


上面有人講這六種基礎排序,選擇,冒泡,插入,快排,歸併,堆排序。

在比較難的快排,歸併和堆排序中,堆排序應該是最容易的,只要知道最大堆的實現方法,就能夠實現堆排序。

快排和歸併用的是分治的思想。

雖然都是分治,但是這兩種分治還是有很大區別的。

還是要理解思想吧。

實在理解不了就背吧


先理解再背吧。如果不理解就背的話,很艱難,即使背下來了也會很快忘記。


親自把它們都敲幾遍,自然都理解並記住了。這其實也是一種背誦吧(?? . ??)


老實說我也是個菜雞,不過說實話你理解演算法之後,動手用實際數據模擬一下演算法,基本也就記住了。


O(n^2)的記住冒泡

O(nlogn)的記住快排

O(n)的記住基排

相信我,其他的沒卵用

快排也只要記一個7行左右的簡化版就行了,那個單獨寫個劃分函數的純屬蛋疼


熱愛怎麼叫背呢,讀書人怎麼叫背呢。


計算機最好話一份時間讀書花九分時間實踐,自己寫的東西比書上的對於自己意義更大


建議找本演算法書,系統地看一遍其中將排序的那一章。理解一下每個排序演算法的思路和過程,然後動手實現下(照著書也不會太難),這樣就記住啦。 當然平時也得要用到,不然很快就忘了。


掌握知識點歸根結底都是要背下來,只是途經有差別。既然死記硬背效果不好,不妨把它做出來,具體可感的東西有助於記憶


用得少就會忘,很正常。

沒必要太死記硬背,把演算法背後的原理理解了,用的時候查一下就行。

當然如果是要面試的話,還是可以稍微背一下的。


面試的時候該背還是要背的。平時使用就沒必要了,忘了查一下就好


推薦閱讀:

C 和 C++ 值得深入學習嗎?
C++ 自己寫一個更好的 string 需要什麼步驟?
C++樹結構實現中,為什麼要單獨定義節點類?

TAG:數據結構 |