2019-03-21 in class

This commit is contained in:
Claudio Maggioni 2019-03-21 15:53:57 +01:00
parent 864d111326
commit 85f6fe46dc
3 changed files with 153 additions and 0 deletions

72
heapsort.py Normal file
View file

@ -0,0 +1,72 @@
#!/usr/bin/env python3
import sys
def heap_extract_max(A):
m = A[0]
A[0] = A.pop()
size = len(A)
i = 0
exit = size == 0
while exit:
left = heap_left(i)
if left == None:
break
right = heap_right(i)
if right == None:
if A[i] < A[left]:
A[i], A[left] = A[left], A[i]
break
ma = max_3(A[i], A[left], A[right])
if ma == A[i]:
break
elif ma == A[left]:
A[i], A[left] = A[left], A[i]
i = left
else:
A[i], A[right] = A[right], A[i]
i = right
return m
def max_3(a, b, c):
if a > b:
if a > c:
return a
else:
return c
else:
if b > c:
return b
else:
return c
def heap_parent(n):
n = n + 1
if n == 1:
return None
else
return (n // 2) - 1
def heap_left(size, n):
n = n + 1
l = n * 2
if l > size
return None
else
return l - 1
def heap_right(size, n):
n = n + 1
l = n * 2 + 1
if l > size
return None
else
return l - 1
if __name__ == "__main__":
args = [int(x) for x in sys.argv[1:]]

View file

@ -99,3 +99,47 @@ stated. The algorithm must terminate.
Invariant condition able to make a loop equivalent to a straight path in an Invariant condition able to make a loop equivalent to a straight path in an
execution graph. execution graph.
# Heaps and Heapsort
A data structure is a way to structure data.
A binary heap is like an array and can be of two types: max heap and min heap.
## Interface of an heap
- `Build_max_heap(A)` and rearranges a into a max-heap;
- `Heap_insert(H, key)` inserts `key` in the heap;
- `Heap_extract_max(H)` extracts the maximum `key`;
- `H.heap_size` returns the size of the heap.
A binary heap is like a binary tree mapped on an array:
```
1
/ \
/ \
2 3
/ \ / \
4 5 6 7
=> [1234567]
```
The parent position of `n` is the integer division of n by 2:
```python
def parent(x):
return x // 2
```
The left of `n` is `n` times 2, and the right is `n` times 2 plus 1:
```python
def left(x):
return x * 2
def right(x):
return x * 2 + 1
```
**Max heap property**: for all i > 1 A[parent(i)] >= A[i]

37
partition.py Normal file
View file

@ -0,0 +1,37 @@
#!/usr/bin/env python3
import sys
import random
def partition(A, begin, end):
v_i = random.randrange(begin, end)
v = A[v_i]
A[v_i], A[end-1] = A[end-1], A[v_i]
i = begin
j = end - 2
while j >= i:
if A[j] > v:
j = j - 1
elif A[i] <= v:
i = i + 1
else:
A[i], A[j] = A[j], A[i]
j = j - 1
i = i + 1
A[i], A[end-1] = A[end-1], A[i]
return i
def quicksort(A, begin, end):
if begin < end - 1:
i = partition(A, begin, end)
print(A[begin:i], A[i], A[i+1:end])
quicksort(A, begin, i)
quicksort(A, i+1, end)
print(A[begin:i], A[i], A[i+1:end])
if __name__ == "__main__":
args = [int(x) for x in sys.argv[1:]]
print(args)
quicksort(args, 0, len(args))
print(args)