Python資料結構與演算法學習第五天

2021-10-06 23:44:56 字數 3359 閱讀 9500

棧可以用順序表實現,也可以用鍊錶實現。

棧的操作

1.stack() 建立乙個新的空棧

2.push(item) 新增乙個新的元素item到棧頂

3.pop() 彈出棧頂元素

4.peek() 返回棧頂元素

5.is_empty() 判斷棧是否為空

6.size() 返回棧的元素個數

**實現:利用順序表

上圖**為定義類。

上圖**為操作與結果,棧是先進後出,所以先將1、2、3順序壓入棧中,最後彈出結果順序為3、2、1。

同棧一樣,佇列也可以用順序表或者鍊錶實現。

佇列的操作

1.queue() 建立乙個空的佇列

2.enqueue(item) 往佇列中新增乙個item元素

3.dequeue() 從佇列頭部刪除乙個元素

4.is_empty() 判斷乙個佇列是否為空

5.size() 返回佇列的大小

**實現:利用順序表實現

上圖為實現佇列的**,佇列與棧不同,隊列為先進先出,可以設想為右邊進,左邊出的模型。

操作為先順序新增1、2、3,當出佇列時,則結果為1、2、3。

雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。

雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。

操作

dequeue() 建立乙個空的雙端佇列

enqueue_front(self,item)從隊頭加入乙個item元素

enqueue_rear(self, item)從隊尾加入乙個item元素

delqueue_front(self)從隊頭刪除乙個item元素

delqueue_rear(self)從隊尾刪除乙個item元素

is_empty() 判斷雙端佇列是否為空

size() 返回佇列的大小

**實現

雙端佇列可以從頭部和尾部新增或者刪除元素。

氣泡排序(bubble sort)是一種簡單的排序演算法。它重複地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍歷數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越大的元素會經由交換慢慢「浮」到數列的尾端。

氣泡排序演算法的運作如下:

比較相鄰的元素。如果第乙個比第二個大(公升序),就交換他們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

**實現:

上圖**為實現氣泡排序的**,首先定義氣泡排序函式,先測試序列長度n,外層迴圈的意思是需要進行n-1次的冒泡過程才能完成每個元素的排序,內層迴圈為當前i位置的元素與後乙個位置的元素進行比較,若比後乙個元素的位置大,則二者調換位置,n-1-j的意思為對比到n-1-j位置的元素,例如當j=0時,需要對比到n-2與n-1(最後乙個元素),這時,最後乙個元素已經為最大的元素,則下次迴圈無需再次與最後乙個元素進行比較,這時j+1=1,下次迴圈只需要對比到倒數第二個元素即可。count的作用為計數,當內層迴圈一次後,發現沒有進行位置調換操作,則說明列表本身就是有序序列,則可以直接退出迴圈,降低時間複雜度。

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理如下:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序的主要優點與資料移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有乙個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

上圖為實現選擇排序**,先定義選擇函式,在計算列表長度n,min_index表示當前的最小值。外層迴圈表示選擇排序需要進行n次排序,同時也代表最小元素從第j開始排序。內層迴圈是從j後面的第乙個元素開始比較,如果j比j後的第乙個元素大,則將j後面的乙個元素的位置給min_index,以此類推,直到最後乙個元素,可以找到當前迴圈下的最小元素,然後再將j開始時的位置與找到內層迴圈中最小元素進行調換,再開始下一次外層迴圈。

插入排序(insertion sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

上圖為實現插入排序的**,首先定義插入排序函式,再測試列表長度,首先先選擇第乙個元素為有序列表,則迴圈從第二個元素開始進行插入。內層迴圈為無序元素與有序元素進行比較,然後插入。例如當第二個元素與第乙個元素進行比較時,若第二個比第乙個小,則調換二者的位置,,否則插入後面,組成新的有序序列。下一次迴圈時,第三個元素首先與第二個比,若比第二個小,則調換位置,再與第乙個比較,否則直接插入最後,組成新的有序列表。當i=0時,則表示插入完畢退出迴圈。

資料結構與演算法學習

我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...

資料結構與演算法學習筆記

演算法基礎篇 第一章 演算法概述 首先了解一下基本的概念 1.1 什麼是演算法呢?從字面意義上理解,演算法就是用於計算的方法,用這種方法達到預期的結果。通俗的講,演算法可以理解為乙個完整的解題步驟,由一些基本的運算和規定的運算順序組成。通過這樣的解題步驟可以解決特定的問題。演算法可以抽象出5個特徵 ...

資料結構與演算法學習二

1 用js中object物件模擬集合set的資料結構 set集合中的資料結構 s s 即集合中的鍵 值相同。故,可令object物件中的鍵 值相同,來模擬set集合及其中的方法,如下 用js中object模擬實現集合set資料結構 es6中有set類,避免混淆這裡用set2 var set2 fun...