堆:一種完全二叉樹,有最大堆和最小堆兩種。
最大堆:根總是最大值,最小的值儲存在葉節點中,
最小堆:每個非葉子節點的兩個孩子的值都比它大。
堆的操作:
插入新的值,依然保證堆的最大堆或者最小堆的結構。
刪除乙個值。
堆的表示:使用陣列表示堆。
parent = int(i-1)/2
left = 2i +1
right = 2i+2
class
array
(object):
def__init__
(self, size=32)
: self._size = size
self._items =
[none
]* size
def__getitem__
(self, index)
:return self._items[index]
def__setitem__
(self, index, value)
: self._items[index]
= value
def__len__
(self)
:return self._size
defclear
(self, value=
none):
for i in
range
(len
(self._items)):
self._items[i]
= value
def__iter__
(self)
:for item in self._items:
yield item
"""heap 實現"""
class
maxheap
(object):
def__init__
(self, maxsize=
none):
self.maxsize = maxsize
self._elements = array(maxsize)
self._count =
0def
__len__
(self)
:return self._count
defadd(self, value)
:if self._count >= self.maxsize:
raise exception(
'full'
)# 開始加入,先把值放在最後一位,最後一位就是_count
self._elements[self._count]
= value
self._count +=
1 self._siftup(self._count -1)
# 定義_siftup函式,傳入的值是新增元素的位置
def_siftup
(self, ndx)
:# 遞迴交換,直到滿足最大堆的特性。
if ndx >0:
parent =
int(
(ndx -1/
2))if self._elements[ndx]
> self._elements[parent]
:# 如果他的值大於父親就交換
self._elements[ndx]
, self._elements[parent]
= self._elements[parent]
, self._elements[ndx]
self._siftup(parent)
# 遞迴
defextract
(self)
:if self._count <=0:
raise exception(
'empty'
) value = self._elements[0]
self._count -=
1 self._elements[0]
= self._elements[self._count]
self._siftdown(0)
return value
def_siftdown
(self, ndx)
: left =
2* ndx +
1 right =
2* ndx +
2 largest = ndx
if(left < self._count and self._elements[left]
>= self._elements[largest]
and self._elements[left]
>=
self._elements[right]):
largest = left
elif right < self._count and self._elements[right]
>= self._elements[largest]
: largest = right
if largest != ndx:
self._elements[ndx]
, self._elements[largest]
= self._elements[largest]
, self._elements[ndx]
self._siftdown(largest)
deftest_max_heap()
:import random
n =5 h = maxheap(n)
for i in
range
(n):
h.add(i)
for i in
reversed
(range
(n))
:assert i == h.extract(
)
資料結構與演算法 19交叉排序
description 輸入n個數,把所有奇數字置上的數從小到大排序,把偶數字置上的數從大到小排序。input 輸入的第一行是乙個正整數n 2 n 100 第二行是n個用空格隔開的整數。output 輸出只有一行n個數,是按要求排序後的序列,用空格隔開。sample input 61 2 3 4 5...
演算法與資料結構實驗題1 9
實驗任務 上回說到,你奔走於各個世界線拯救靜靜。現在,完成任務的你決定玩個簡單的遊戲靜一靜。我們知道,數字在計算機裡是用二進位制儲存的,現在你想知道如果把乙個數字的二進位制倒過來是多少。比如 int a 5,用二進位制表示就是00000000000000000000000000000101。把它倒過...
C 資料結構與演算法揭秘19
這節,我們介紹基數排序和歸併排序。一 基數排序 基數排序 radix sort 的設計思想與前面介紹的各種排序方法完全不同。前面介紹的排序方法主要是通過關鍵碼的比較和記錄的移動這兩種操作來實現排序的,而基數排序不需要進行關鍵碼的比較和記錄的移動。基數排序是一種借助於多關鍵碼排序的思想,是將單關鍵碼按...