Python数据结构与算法(第五天)
34.棧與隊(duì)列的概念
棧
棧(stack),有些地方稱為堆棧,是一種容器,可存入數(shù)據(jù)元素、訪問元素、刪除元素,它的特點(diǎn)在于只能允許在容器的一端(稱為棧頂端指標(biāo),英語:top)進(jìn)行加入數(shù)據(jù)(英語:push)和輸出數(shù)據(jù)(英語:pop)的運(yùn)算。沒有了位置概念,保證任何時(shí)候可以訪問、刪除的元素都是此前最后存入的那個(gè)元素,確定了一種默認(rèn)的訪問順序。
由于棧數(shù)據(jù)結(jié)構(gòu)只允許在一端進(jìn)行操作,因而按照后進(jìn)先出(LIFO, Last In First Out)的原理運(yùn)作。
隊(duì)列
隊(duì)列(queue)是只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。
隊(duì)列是一種先進(jìn)先出的(First In First Out)的線性表,簡稱FIFO。允許插入的一端為隊(duì)尾,允許刪除的一端為隊(duì)頭。隊(duì)列不允許在中間部位進(jìn)行操作!假設(shè)隊(duì)列是q=(a1,a2,……,an),那么a1就是隊(duì)頭元素,而an是隊(duì)尾元素。這樣我們就可以刪除時(shí),總是從a1開始,而插入時(shí),總是在隊(duì)列最后。這也比較符合我們通常生活中的習(xí)慣,排在第一個(gè)的優(yōu)先出列,最后來的當(dāng)然排在隊(duì)伍最后。
35.棧的實(shí)現(xiàn)??
棧結(jié)構(gòu)實(shí)現(xiàn)
棧可以用順序表實(shí)現(xiàn),也可以用鏈表實(shí)現(xiàn)。
棧的操作
- Stack() 創(chuàng)建一個(gè)新的空棧
- push(item) 添加一個(gè)新的元素item到棧頂
- pop() 彈出棧頂元素
- peek() 返回棧頂元素
- is_empty() 判斷棧是否為空
- size() 返回棧的元素個(gè)數(shù)
36.隊(duì)列與雙端隊(duì)列的實(shí)現(xiàn)
隊(duì)列的實(shí)現(xiàn)
同棧一樣,隊(duì)列也可以用順序表或者鏈表實(shí)現(xiàn)。
操作
- Queue() 創(chuàng)建一個(gè)空的隊(duì)列
- enqueue(item) 往隊(duì)列中添加一個(gè)item元素
- dequeue() 從隊(duì)列頭部刪除一個(gè)元素
- is_empty() 判斷一個(gè)隊(duì)列是否為空
- size() 返回隊(duì)列的大小
雙端隊(duì)列
雙端隊(duì)列(deque,全名double-ended queue),是一種具有隊(duì)列和棧的性質(zhì)的數(shù)據(jù)結(jié)構(gòu)。
雙端隊(duì)列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進(jìn)行。雙端隊(duì)列可以在隊(duì)列任意一端入隊(duì)和出隊(duì)。
操作
- Deque() 創(chuàng)建一個(gè)空的雙端隊(duì)列
- add_front(item) 從隊(duì)頭加入一個(gè)item元素
- add_rear(item) 從隊(duì)尾加入一個(gè)item元素
- remove_front() 從隊(duì)頭刪除一個(gè)item元素
- remove_rear() 從隊(duì)尾刪除一個(gè)item元素
- is_empty() 判斷雙端隊(duì)列是否為空
- size() 返回隊(duì)列的大小
37.排序算法的穩(wěn)定性
排序與搜索
排序算法(英語:Sorting algorithm)是一種能將一串?dāng)?shù)據(jù)依照特定順序進(jìn)行排列的一種算法。
排序算法的穩(wěn)定性
穩(wěn)定性:穩(wěn)定排序算法會讓原本有相等鍵值的紀(jì)錄維持相對次序。也就是如果一個(gè)排序算法是穩(wěn)定的,當(dāng)有兩個(gè)相等鍵值的紀(jì)錄R和S,且在原本的列表中R出現(xiàn)在S之前,在排序過的列表中R也將會是在S之前。
當(dāng)相等的元素是無法分辨的,比如像是整數(shù),穩(wěn)定性并不是一個(gè)問題。然而,假設(shè)以下的數(shù)對將要以他們的第一個(gè)數(shù)字來排序。
(4, 1) (3, 1) (3, 7)(5, 6)在這個(gè)狀況下,有可能產(chǎn)生兩種不同的結(jié)果,一個(gè)是讓相等鍵值的紀(jì)錄維持相對的次序,而另外一個(gè)則沒有:
(3, 1) (3, 7) (4, 1) (5, 6) (維持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)不穩(wěn)定排序算法可能會在相等的鍵值中改變紀(jì)錄的相對次序,但是穩(wěn)定排序算法從來不會如此。不穩(wěn)定排序算法可以被特別地實(shí)現(xiàn)為穩(wěn)定。作這件事情的一個(gè)方式是人工擴(kuò)充鍵值的比較,如此在其他方面相同鍵值的兩個(gè)對象間之比較,(比如上面的比較中加入第二個(gè)標(biāo)準(zhǔn):第二個(gè)鍵值的大小)就會被決定使用在原先數(shù)據(jù)次序中的條目,當(dāng)作一個(gè)同分決賽。然而,要記住這種次序通常牽涉到額外的空間負(fù)擔(dān)。
?
38.冒泡排序及實(shí)現(xiàn)
冒泡排序
冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復(fù)地遍歷要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯誤就把他們交換過來。遍歷數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?jīng)由交換慢慢“浮”到數(shù)列的頂端。
冒泡排序算法的運(yùn)作如下:
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大(升序),就交換他們兩個(gè)。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
- 針對所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
- 持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
冒泡排序的分析
def bubble_sort(alist):n = len(alist)for j in range(n-1):# j表示每次遍歷需要比較的次數(shù),是逐漸減小的for i in range(n-1-j):if alist[i] > alist[i+1]:alist[i], alist[i+1] = alist[i+1], alist[i] if __name__ == "__main__":li=[1,50,100,2,4,55,11]bubble_sort(li)print(li) [1, 2, 4, 11, 50, 55, 100]時(shí)間復(fù)雜度
- 最優(yōu)時(shí)間復(fù)雜度:O(n) (表示遍歷一次發(fā)現(xiàn)沒有任何可以交換的元素,排序結(jié)束。)
- 最壞時(shí)間復(fù)雜度:O(n^2)
- 穩(wěn)定性:穩(wěn)定
39.選擇排序算法及實(shí)現(xiàn)
選擇排序
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
選擇排序的主要優(yōu)點(diǎn)與數(shù)據(jù)移動有關(guān)。如果某個(gè)元素位于正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當(dāng)中至少有一個(gè)將被移到其最終位置上,因此對n個(gè)元素的表進(jìn)行排序總共進(jìn)行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序?qū)儆诜浅:玫囊环N。
選擇排序分析
排序過程
?
def selection_sort(alist):n = len(alist)for i in range(n-1):min_index = ifor j in range(i+1, n):if alist[j] < alist[min_index]:min_index = jalist[i], alist[min_index] = alist[min_index], alist[i]alist = [54,226,93,17,77,31,44,55,20] selection_sort(alist) print(alist) [17, 20, 31, 44, 54, 55, 77, 93, 226]時(shí)間復(fù)雜度
- 最優(yōu)時(shí)間復(fù)雜度:O(n2)
- 最壞時(shí)間復(fù)雜度:O(n2)
- 穩(wěn)定性:不穩(wěn)定(考慮升序每次選擇最大的情況)
40.插入算法
插入排序
插入排序(英語:Insertion Sort)是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。插入排序在實(shí)現(xiàn)上,在從后向前掃描過程中,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間,后面是無序序列前面是有序序列。
def insert_sort(alist):# 從第二個(gè)位置,即下標(biāo)為1的元素開始向前插入for i in range(1, len(alist)):# 從第i個(gè)元素開始向前比較,如果小于前一個(gè)元素,交換位置for j in range(i, 0, -1):if alist[j] < alist[j-1]:alist[j], alist[j-1] = alist[j-1], alist[j]alist = [54,26,93,17,77,31,44,55,20] insert_sort(alist) print(alist) [17, 20, 26, 31, 44, 54, 55, 77, 93]時(shí)間復(fù)雜度
- 最優(yōu)時(shí)間復(fù)雜度:O(n) (升序排列,序列已經(jīng)處于升序狀態(tài))
- 最壞時(shí)間復(fù)雜度:O(n2)
- 穩(wěn)定性:穩(wěn)定
總結(jié)
以上是生活随笔為你收集整理的Python数据结构与算法(第五天)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python数据结构与算法(第四天)
- 下一篇: Python数据结构与算法(第六天)