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

時間 2021-05-07 16:15:01

1樓:小齊本齊

當然不要背。。。

還記得《演算法導論》引入插入排序的例子:打牌。

不過不能學胡適先生啊~

插入排序的優化是希爾排序,稍微知道就行,不知道也無妨。

然後選擇排序也很直觀,每一輪「選擇」最小值排好。選擇排序每一輪選擇最小值的過程用 heapify() 來優化,就公升級為 heap sort,堆排序,但是實踐中效果不好,不常用。

那麼效率高常用的有哪些?

歸併排序和快排。

占個坑之後來答。

2樓:手有魚香

最好的記演算法的方式是,在你準備記這個演算法的時候,先看看這個演算法要解決的問題,以及有什麼特點,自己先實現一遍。

如果實現出來與目標演算法差不多,你根本不用背了。

如果與目標有點差距,看一下差距在哪,然後做修改,這樣你只需要記住一些小細節。

如果無從下手,說明你的知識儲備還不足以開始學習這個演算法。

比如快速排序,解決的是資料排序問題,時間複雜度n log(n)。

要能理解上面的內容。至少得明白什麼是排序,以及時間複雜度的衡量標準。

有了這些基礎之後,自己先實現一遍,再和別人的演算法對比,就容易記住了。

3樓:NILL

看完諸君的答案,總結下:

三種回答思路:

1. 熟能生巧經驗論

2. 搞明白原理理解論

3. 不需要記,會查就行

我個人是十分主張第三種,但是考試形式不允許。那麼,在短時間內可以試著結合2+1,理解大概輪廓+巧記(按照你自己的方法)不理解的地方。

尊重客觀規律,發揮主觀能動性,最近學習馬克思主義領會的精華,因為,快期末了。

4樓:flyingfish

演算法靠的是理解。

如果一時不能領悟,那就搞5到10個小資料集合在紙上模擬一下演算法的物理過程。

先模擬冒泡,再合併,然後快排。想清楚過程後,用程式來代替模擬過程。

5樓:二胖

反正我是背的,但是這僅限於去面試的時候,因為面試的時候會讓你寫各種排序。

以上都是毫無卡頓的寫出來,也都順利的拿到了offer,因為去面試之前都背熟了。

工作中就再也沒背過,一般需要排序的時候要麼調庫要麼搜尋引擎查一下。

我個人認為,在工作中對於一些常見的演算法,用不著非得能一字不落的揹著寫出來,但是你一定得知道它們的原理以及應用場景。

6樓:

關鍵還是思想,比如用greedy就可以得出selection sort和insertion sort,用divide and conquer就可以得到merge sort和quick sort。其他演算法思想多見的也就dynamic programming和linear programming了。理解了這四種思想(或者前三種)再看學過的演算法就可以理解著記憶了,雖然真正學好這些思想更難…

初學還是背……其實我覺得演算法的內容和思想應該雜糅著講效果會更好。

7樓:北南

背下來吧,就背快排和堆排就行,歸併排序不用背,但最好背下來怎麼合併兩個有序鍊錶。

這三個(其實是兩個半)背下來,可以很多變化,比如說快排可以變換成找top k或者中位數的selection演算法。堆排背下來就搞懂了二叉堆,堆可以做N多涉及優先順序佇列的演算法,最短路也用得到。

這些搞下來,你就熟悉了陣列,鍊錶,堆,二叉樹,然後你會發現二叉樹可以放在陣列裡,也可以像鍊錶那樣連著。圖也是可以用陣列和鍊錶來表達成鄰接表,然後你會發現Hash表也是類似的結構。

到此為止,你只需要背這兩個半的排序,本科時代的資料結構與演算法你就基本學通了。。。。

有些朋友對用類似QuickSort的演算法在linear時間找top k有疑問,這有個課程

Selection - Quicksort | Coursera

還有這個

Quickselect Algorithm - GeeksforGeeks

其實就是一種基於快排演算法的不完全排序演算法,咱們不用把n個元素都排好序,但只要把大的k個元素換到前面就好了。這個複雜度是O(n)的,因為總的交換的次數的極限是n的常量倍。

8樓:sericus

如果是複雜度為平方的演算法(冒泡,插入等等),根本不用背,原理很簡單,自己寫就行。

如果是快排,歸併之類的,可以用庫函式啊,優先佇列也可以啊。實在是要寫的話請一定清楚地理解好遞迴函式的所有細節。這樣差不多就可以了。

9樓:Abcd

記不住主要是因為沒有理解演算法的原理,比如快排就是每次拿出乙個元素,把陣列中比它小的放左邊,比它大的放右邊,再分治遞迴,把兩側的陣列排好序,想忘記都難。排序的演算法最重要的用途有兩個,乙個是考試面試,乙個是啟發思維,培養程式思維能力。這都需要深入了解演算法的內在邏輯,不僅是能寫對,還得能證明,能變通。

可以學習下演算法導論,不要看嚴老師那本資料結構,演算法導論循序漸進,庖丁解牛,深入淺出,遠遠比其他的教材容易理解又能揭示本質。

10樓:

用的多了,自然就記住了。

如果不是常用知識,記它幹嘛?能查到得知識,都沒必要記,留著腦子想更有用的事情不好嗎?

個人認為,學計算機,會查比會背重要的多。

11樓:張泉

歸併排序:體育課上已經站好4排隊。老師說:

12排合成一排,34排合成一排。然後大家開始前後合併,當我前面的人站入新隊之後,我和另一隊剩下的人比較下個頭,我矮我就站入新隊她矮她就站入.....兩排隊完成了一些活動之後,老師又說:

現在站成一排!就用同樣的方法站成一排!

氣泡排序:狹窄的走道上大家亂序站成一排,老師說我們按高矮個發號牌!1號!

最後乙個人開始看自己是不是比前邊的人矮,是就往前換,不是的話就換前邊的人往前比較和交換,直到最矮的換到前面。然後2號!在剩下的人當中繼續這麼做直到第二矮的換到1號後面....

依次找到3號4號......

快速排序:體育課上人太多老師覺得分兩撥活動。找個個子適中的人,比他矮的去跑步,比他高的去打球。

打球的那組人還是多,又指定乙個人,比他矮的踢足球,比他高的打籃球。.......找不到合適的例子啦,勉強說個意思吧。

12樓:阿豆豆阿豆

這玩意不用背,但是自己一定要實現一次,以後就算忘了,回頭看看思路也能寫出來。最近也在看演算法,剛開始的時候寫著挺痛苦,給了思路也寫不出來,但是後面寫多了就越來越容易

13樓:[已重置]

不需要背啊,知道關鍵點就會寫了

冒泡\選擇\插入: 反正就兩個for迴圈

堆排: 用堆

快排: 自上而下分治

歸併: 自下而上分治

14樓:非著名程式設計師

賣油翁的故事告訴我們:熟能生巧;

運動員的故事告訴我們:持續長久的不斷的重複練習,會產生肌肉記憶,從而可以很好的完成每乙個運動動作。

程式設計師我感覺已經很好了,具體演算法的使用你可能記不住,但是演算法的名字你應該能記住吧!什麼時候該用什麼演算法?

我們程式設計靠的當然也是不斷地練習,實踐和使用,常用的東西用的多了自然就記住了。但是如果不常用的東西你應該了解,知道,具體用法你可以查文件,查資料,跟開卷考試一樣。

演算法可能用的不多,但是常用演算法地名字和使用場景你知道就行。具體用法可以查,又不是讓你閉卷考試。

再說了,死記硬背解決不了問題,一年用一次的話,用的時候背過了,下次用的時候早就忘了,理解最重要,知道什麼時候用什麼就行,用的時候查文件。記住:讀書百遍其義自見。

程式設計亦如此!!!

15樓:李魔劍

O(n^2)的記住冒泡

O(nlogn)的記住快排

O(n)的記住基排

相信我,其他的沒卵用

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

16樓:Cifer

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

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

17樓:安陽

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

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

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

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

還是要理解思想吧。

實在理解不了就背吧

18樓:

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

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

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

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

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

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

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

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

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

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

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

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

系列專題

19樓:羽涅

用得少就會忘,很正常。

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

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

怎樣反駁 程式 演算法 資料結構 的言論?

程式 演算法 資料結構 這個沒有錯.但是老闆需要的不是程式,而是乙個特定的應用程式.白馬非馬.應用程式不是程式.說 程式 演算法 資料結構 缺乏現實意義.對需求的滿足沒有幫助.以上.if 0 你就是說贏他也沒用呀,你基本功還是比不過他呀.else 你管他說什麼啊.練自己的本事就好了嘛.endif 很...

學新的語言還是學演算法資料結構?

早起的鳥兒 資料結構真的很重要!你可以學一門語言的時候,順便再用它來寫資料結構。資料結構學的差不多的時候,這門語言的語法也基本上學完了。其實,同一類的語言語法相似點很多的,只要學會一種,其他的都很好學。 賴敬之 瀉藥個人認為基礎打好比較重要,C語言的話建議先閱讀一遍 C primer plus 這本...

資料結構的排序中為什麼關鍵字會重複?

James Yin 因為查詢可以有多種策略,比如 查全部 字串匹配 findall 第乙個 最後乙個 stl lower bound upper bound 等等。另外,如果排序演算法不允許重複,那對元素可重複的序列要怎麼排序呢?題主說的唯一匹配,沒理解錯的話應該指map類資料結構,比如二叉查詢樹 ...