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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

堆排序python代码实现_python实现堆排序

發布時間:2023/12/10 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 堆排序python代码实现_python实现堆排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先理解堆排序:

堆:

堆棧是計算機的兩種最基本的數據結構。堆的特點就是FIFO(first in first out)先進先出,這里的話我覺得可以理解成樹的結構。堆在接收數據的時候先接收的數據會被先彈出。棧的特性正好與堆相反,是屬于FILO(first in/last out)先進后出的類型。棧處于一級緩存而堆處于二級緩存中。這個不是本文重點所以不做過多展開。

思想:

本質是使用大根堆或小根堆來對一個數組進行排序。所以首先要理解樹的概念,若是不太理解樹的概念可以自行百度。

完全二叉樹:

堆是一種完全二叉樹,就是除了最后一層之外的其他每一層都被完全填充,并且所有結點都保持向左對齊的樹。就像碼金字塔的磚塊,必須從頭到底,從左到右一個一個碼,不能空缺。。

大根堆小根堆定義:

大根堆:每個結點的值都大于或等于左右子結點

小根堆:每個結點的值都小于或等于左右子結點

大根堆

小根堆

關于數組下標

將一個數組構建成二叉樹的結構,那么對于其中某一個元素的index假設為n,滿足以下條件:

1)它的父節點若存在,父節點的index為n//2(n//2指n除以2取整數)

2)若是左子節點存在,index為2*n

3)若是右子節點存在,index為2*n+1

注意:以上條件是在index是從1開始才滿足,所以在后面計算中會在數組第一個位置添加一個[0]作為占位元素。

操作步驟:

以由對數組從小到大進行排序的情況,需要構建大根堆。

1.首先將整個數組進行構建一個大根堆得到[0,R1,....,Rn](具體實現后面講)

2.由于R1是最大的數,所以把R1與Rn改變位置,變成[0,Rn,...,Rn-1,R1],此時[0,Rn...,Rn-1]是無序的,[R1]是有序的

3.對數組[0,Rn...,Rn-1]進行重構大根堆,得到[0,R2,....,Rn-1]

4.由于R2是最大的數,所以把R2與Rn-1改變位置,變成[0,Rn-1,...Rn-2,R2,R1],此時[0,Rn-1...,Rn-2]是無序的,[R2,R1]是有序的

5.重復以上步驟,直到無序列表只有[0],最終得到的有序序列則是按照從小到大規律排列的。

為了能更好的理解上面的話,我推薦看b站這個視頻演示。。https://www.bilibili.com/video/av18980178?from=search&seid=3518072115040122033

代碼:

1 importmath,random2

3 #網上找的打印樹的一個函數,很好用,誰用誰知道

4 def print_tree(array): #打印堆排序使用

5 '''

6 深度 前空格 元素間空格7 1 7 08 2 3 79 3 1 310 4 0 111 '''

12 #first=[0]

13 #first.extend(array)

14 #array=first

15 index = 1

16 depth = math.ceil(math.log2(len(array))) #因為補0了,不然應該是math.ceil(math.log2(len(array)+1))

17 sep = ' '

18 for i inrange(depth):19 offset = 2 **i20 print(sep * (2 ** (depth - i - 1) - 1), end='')21 line = array[index:index +offset]22 for j, x inenumerate(line):23 print("{:>{}}".format(x, len(sep)), end='')24 interval = 0 if i == 0 else 2 ** (depth - i) - 1

25 if j < len(line) - 1:26 print(sep * interval, end='')27 index +=offset28 print()29

30 defsort(arr,start,end):31 if end == start * 2:32 if arr[start * 2] >arr[start]:33 arr[start * 2], arr[start] = arr[start], arr[start * 2]34 else:35 if end < start * 2 + 1:36 return

37 else:38 left = arr[start*2]39 right = arr[start*2+1]40 if left>right and left >arr[start]:41 arr[start * 2 ], arr[start] = arr[start], arr[start * 2]42 sort(arr,start*2,end)43 if leftarr[start]:44 arr[start * 2+1], arr[start] = arr[start], arr[start * 2+1]45 sort(arr, start * 2+1, end)46

47 defheapfiy(arr):48 x = len(arr) - 1

49 n = x // 2

50 while n >0:51 #print(n)

52 sort(arr, n, x)53 n -= 1

54

55 #以下是主函數

56

57 #第一個0是占位用

58 orignal_list=[0, 74, 73, 59, 72, 64, 69, 43, 36, 70, 61, 40, 16, 47, 67, 17, 31, 19, 24, 14, 20, 48, 5, 7, 3, 78, 84, 92, 97, 98, 99]59 print(orignal_list)60 #第一次構建最大堆

61 heapfiy(orignal_list)62 #打印樹

63 print_tree(orignal_list)64

65 x= len(orignal_list) - 1

66 while x!=1:67 #交換最大的數和最后一個

68 orignal_list[1],orignal_list[x]=orignal_list[x],orignal_list[1]69 x-=1

70 #由于交換了,不再是最大堆,重新構建最大堆

71 n=x//2

72 while n>0:73 sort(orignal_list,n,x)74 n-=1

75

76 #打印最后結果

77 print_tree(orignal_list)78 print(orignal_list)

結果如下

總結

以上是生活随笔為你收集整理的堆排序python代码实现_python实现堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。