日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python数据结构和算法3 栈、队列和排序

發(fā)布時(shí)間:2024/1/17 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python数据结构和算法3 栈、队列和排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

順序表和鏈表都是線(xiàn)性表,線(xiàn)性數(shù)據(jù)

stack,也叫堆棧,是一種容器,可存入元素、訪(fǎng)問(wèn)元素、刪除元素,特點(diǎn)是只允許在容器的一端(棧頂,top)進(jìn)行加入數(shù)據(jù)(壓棧,push)和輸出數(shù)據(jù)(pop),按照后進(jìn)先出(LIFO,last in first out)的原理運(yùn)作。

棧的實(shí)現(xiàn)

class Stack(object):"""棧"""def __init__(self):self.__list = []def push(self, item):"""添加一個(gè)新的元素item到棧頂"""return self.__list.append(item)def pop(self):"""彈出棧頂元素"""return self.__list.pop( )def peek(self):"""返回棧頂元素"""if self.__list:return self.__list[-1]else:return Nonedef is_empty(self):"""判斷棧是否為空"""# return self.__list 不可以這樣寫(xiě),調(diào)用is_empty直接使用內(nèi)部列表了# 空列表代表是假,"",{},(),[]都是假return self.__list == []def size(self):"""返回棧的元素個(gè)數(shù)"""return len(self.__list)if __name__=="__main__":s = Stack()s.push(1)s.push(2)s.push(3)s.push(4)print(s.pop())print(s.pop())print(s.pop())print(s.pop())

?

隊(duì)列

也是線(xiàn)性容器,只能從一端添加,從另一端去取,排隊(duì),先進(jìn)先出

class Queue(object):"""隊(duì)列"""def __init__(self):self.__list = []def enqueue(self, item):"""往隊(duì)列中添加一個(gè)item元素"""self.__list.append(item)def dequeue(self):"""從隊(duì)列頭部刪除一個(gè)元素"""return self.__list.pop(0)def is_empty(self):"""判斷一個(gè)隊(duì)列是否為空"""return self.__list == []def size(self):"""返回隊(duì)列的大小"""return len(self.__list)if __name__=="__main__":s = Queue()s.enqueue(1)s.enqueue(2)s.enqueue(3)s.enqueue(4)print(s.dequeue())print(s.dequeue())print(s.dequeue())print(s.dequeue())

排序算法

sorting algorithm 將一串?dāng)?shù)據(jù)按特定順序進(jìn)行排序的算法

排序算法的穩(wěn)定性,穩(wěn)定排序算法會(huì)讓原本有相等鍵值的紀(jì)錄維持相對(duì)次序。

冒泡排序

def bubble_sort(alist):"""冒泡排序"""n = len(alist)for j in range(len(alist)-1,0,-1):for i in range(j):if alist[i] > alist[i+1]:alist[i],alist[i+1] = alist[i+1],alist[i]li = [54,26,93,17,77,31,44,55,20] bubble_sort(li) print(li)

選擇排序

它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類(lèi)推,直到所有元素均排序完畢。

def select_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 = j# 如果選擇的數(shù)據(jù)不在正確位置,進(jìn)行交換if min_index != i:alist[i], alist[min_index] = alist[min_index], alist[i]alist = [12,1,54,22,31,3] select_sort(alist) print(alist)

插入排序

insertion sort ,它的工作原理是通過(guò)構(gòu)建有序序列,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入。

左邊有序,右邊無(wú)序,從右邊取出第一個(gè)往左邊挪,從右往左依次比較確定自己的位置。

def insert_sort(alist):"""插入元素"""#第二個(gè)位置開(kāi)始往前插入,下標(biāo)為1for i in range(1,len(alist)):# 從第i個(gè)元素開(kāi)始往前比較,小于前一個(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,11,44,35,67,99,5] insert_sort(alist) print(alist)

希爾排序

希爾排序(Shell Sort)是插入排序的一種。也稱(chēng)縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。希爾排序的基本思想是:將數(shù)組列在一個(gè)表中并對(duì)列分別進(jìn)行插入排序,重復(fù)這過(guò)程,不過(guò)每次用更長(zhǎng)的列(步長(zhǎng)更長(zhǎng)了,列數(shù)更少了)來(lái)進(jìn)行。最后整個(gè)表就只有一列了。

def shell_sort(alist):n = len(alist)# 初始步長(zhǎng)gap = n//2while gap>0:for i in range(gap, n):j = iwhile j>=gap and alist[j]<alist[j-gap]:alist[j-gap],alist[j] = alist[j],alist[j-gap]gap = gap//2if __name__ == "__main__":alist = [54,26,93,17,77,31,44,55,20]shell_sort(alist)print(alist)

快速排序

quicksort,通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。如54,最終結(jié)果讓54左邊的數(shù)比54都小,右邊的都比54大。

步驟為:

  • 從數(shù)列中挑出一個(gè)元素,稱(chēng)為"基準(zhǔn)"(pivot),
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)結(jié)束之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱(chēng)為分區(qū)(partition)操作。
  • 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。
  • 遞歸的最底部情形,是數(shù)列的大小是零或一,也就是永遠(yuǎn)都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個(gè)算法總會(huì)結(jié)束,因?yàn)樵诿看蔚牡?#xff08;iteration)中,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去。

    排序代碼參考快速排序上的,課件上的太繁瑣

    def quick_sort(alist):if len(alist) <= 1:return alist# 左邊存放小于基準(zhǔn)的數(shù)字left = []# 右邊存放大于基準(zhǔn)的數(shù)字right = []# 基準(zhǔn)數(shù)字base = alist.pop()# 對(duì)原數(shù)組進(jìn)行劃分for i in alist:if i < base:left.append(i)else:right.append(i)# 遞歸調(diào)用return quick_sort(left) + [base] + quick_sort(right)def main():alist = [1,4,7,5,2,8,9,6,3,10]print(quick_sort(alist)) main()

    歸并排序

    采用分治法的一個(gè)非常典型的應(yīng)用。歸并排序的思想就是先遞歸分解數(shù)組,再合并數(shù)組。

    將數(shù)組分解最小之后,然后合并兩個(gè)有序數(shù)組,基本思路是比較兩個(gè)數(shù)組的最前面的數(shù),誰(shuí)小就先取誰(shuí),取了后相應(yīng)的指針就往后移一位。然后再比較,直至一個(gè)數(shù)組為空,最后把另一個(gè)數(shù)組的剩余部分復(fù)制過(guò)來(lái)即可。

    def merge_sort(alist):if len(alist)<=1:return alistnum = len(alist)//2left = merge_sort(alist[:num])right = merge_sort(alist[num:])# 合并return merge(left, right)def merge(left, right):"""合并操作,將left[]和right[]合并"""# left,right的下標(biāo)指針l,r = 0,0result = []while l<len(left) and r<len(right):if left[l]<right[r]:result.append(left[l])l += 1else:result.append(right[r])r += 1result += left[l:]result += right[r:]return resultalist = [54,26,93,17,77,31,44,55,20] sorted_alist = merge_sort(alist) print(sorted_alist)

    常見(jiàn)排序算法比較

    搜索

    二分查找

    也叫折半查找,優(yōu)點(diǎn)是比較次數(shù)少,查找速度快,平均性能好;其缺點(diǎn)是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經(jīng)常變動(dòng)而查找頻繁的有序列表。條件:有序的順序表?

    def binary_search(alist,item):"""二分查找,遞歸"""n = len(alist)if n>0:mid = n//2if alist[mid]==item:return Trueelif item<alist[mid]:return binary_search(alist[:mid], item)else:return binary_search(alist[mid+1:],item)return Falsedef binary_search_2(alist,item):"""二分查找,非遞歸"""n = len(alist)first = 0last = n-1while first<=last:mid = (first+last)//2if alist[mid]==item:return Trueelif item<alist[mid]:last = mid -1else:first = mid + 1return Falseif __name__=="__main__":alist = [0, 1, 2, 8, 13, 17, 19, 32, 42, ]print(binary_search(alist, 3))print(binary_search(alist, 13))print(binary_search_2(alist, 3))print(binary_search_2(alist, 13))

    時(shí)間復(fù)雜度

    • 最優(yōu)時(shí)間復(fù)雜度:O(1)
    • 最壞時(shí)間復(fù)雜度:O(logn)

    轉(zhuǎn)載于:https://www.cnblogs.com/wangjinliang1991/p/9898899.html

    總結(jié)

    以上是生活随笔為你收集整理的python数据结构和算法3 栈、队列和排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。