2019-03-21 in class
This commit is contained in:
parent
864d111326
commit
85f6fe46dc
3 changed files with 153 additions and 0 deletions
72
heapsort.py
Normal file
72
heapsort.py
Normal 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:]]
|
||||||
|
|
44
notes.md
44
notes.md
|
@ -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
37
partition.py
Normal 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)
|
||||||
|
|
Reference in a new issue