Advertisement
FroztGal

Structures_last

Oct 23rd, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.47 KB | None | 0 0
  1. class StackWithMaxElement:
  2.     # Надо сделать универсально что бы можно было задавать параметром с максимумом или с минимумом
  3.     def __init__(self):
  4.         self.items = []
  5.         self.max = []
  6.  
  7.     def push(self, item):
  8.         self.items.append(int(item))
  9.         if len(self.max) == 0:
  10.             self.max.append(item)
  11.         elif item >= self.max[-1]:
  12.             self.max.append(item)
  13.  
  14.     def pop(self):
  15.         tmp = self.items.pop()
  16.         if tmp == self.max[-1]:
  17.             self.max.pop()
  18.         return tmp
  19.  
  20.     def get_max(self):
  21.         return self.max[-1]
  22.  
  23.     def is_empty(self):
  24.         return len(self.items) == 0
  25.  
  26.     def clear(self):
  27.         self.items.clear()
  28.  
  29.  
  30. class QueueWithMaxElement:
  31.     def __init__(self):
  32.         self.stack1 = StackWithMaxElement()
  33.         self.stack2 = StackWithMaxElement()
  34.  
  35.     def push(self, item):
  36.         self.stack1.push(item)
  37.  
  38.     def pop(self):
  39.         if self.stack2.is_empty():
  40.             while not self.stack1.is_empty():
  41.                 self.stack2.push(self.stack1.pop())
  42.         return self.stack2.pop()
  43.  
  44.     def get_max(self):
  45.         if self.stack1.is_empty():
  46.             return self.stack2.get_max()
  47.         elif self.stack2.is_empty():
  48.             return self.stack1.get_max()
  49.         else:
  50.             return max(self.stack1.get_max(), self.stack2.get_max())
  51.  
  52.  
  53. class Heap:
  54.     def __init__(self, dimension=2, modifier='maximum'):
  55.         self.items = []
  56.         self.size = 0
  57.         self.d = dimension
  58.         self.modifier = modifier
  59.  
  60.     def get_parent_index(self, index):
  61.         return (index-1)/self.d
  62.  
  63.     def get_children_indices(self, index):
  64.         tmp = []
  65.         for i in range(self.d):
  66.             tmp.append(self.d * index + i + 1)
  67.         return tmp
  68.  
  69.     def sift_up(self, index):
  70.         tmp_index = get_parent_index(index)
  71.         while index > 0 and self.items[tmp_index] < self.items[index]:
  72.             tmp = self.items[tmp_index]
  73.             self.items[tmp_index] = self.items[index]
  74.             self.items[index] = tmp
  75.             index = tmp_index
  76.  
  77.     def sift_down(self, index):
  78.         max_index = index
  79.         children_indices = get_children_indices(index)
  80.         for i in children_indices:
  81.             if i <= size and self.items[i] > self.items[max_index]:
  82.                 max_index = i
  83.         if index != max_index:
  84.             tmp = self.items[max_index]
  85.             self.items[max_index] = self.items[index]
  86.             self.items[index] = tmp
  87.             sift_down(max_index)
  88.  
  89.     def insert(self, priority):
  90.         self.size += 1
  91.         self.items[self.size] = priority
  92.         sift_up(self.size)
  93.  
  94.     def extract_max(self):
  95.         res = self.items[0]
  96.         self.items[0] = self.items[self.size]
  97.         self.size -= 1
  98.         sift_down(0)
  99.         return res
  100.  
  101.     def remove(self, index):
  102.         res = self.items[index]
  103.         self.items[index] = self.items[self.size]
  104.         self.size -= 1
  105.         sift_down(index)
  106.         return res
  107.  
  108.     def change_priority(self, index, priority):
  109.         old_p = self.items[index]
  110.         self.items[index] = priority
  111.         if priority > old_p:
  112.             sift_up(index)
  113.         else:
  114.             sift_down(index)
  115.  
  116.  
  117. def heap_sort(array):
  118.     heap = Heap()
  119.     for i in range(len(array)):
  120.         heap.insert(array[i])
  121.     for i in range(len(array), 0, -1):
  122.         array[i] = heap.extract_max()
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement