import random
class Student:
def __init__(self, x,n):
self.val = x
self.name = n
class Node:
def __init__(self, x,left=None,right=None,p=None):
self.val = x
self.left = None
self.right = None
li=[];
for t in range(20):
r=random.randint(1,80)
s=Student(r,"张三"+str(r));
li.append(s)
for t in li:
print(t.name,t.val)
def shiftDown(a,i):
if(len(a)>i*2+2):
if(a[i]>a[i*2+1] or a[i]>a[i*2+2] ):
if(a[i*2+1] <a[i*2+2] ):
a[i],a[i*2+1]=a[i*2+1],a[i]
shiftDown(a, i*2+1)
else:
a[i], a[i * 2 + 2] = a[i * 2 + 2], a[i]
shiftDown(a, i*2+2)
elif (len(a)==i*2+2):
if a[i] > a[i * 2 + 1]:
a[i], a[i * 2 + 1] = a[i * 2 + 1], a[i]
def shiftUp(a):
while len(a) > 0:
print(a[0])
a[0] = a[-1]
a.pop()
shiftDown(a, 0)
arr=[7,12,3,56,7,8,33,5,89,23,234,5,2332,2,45]
#treePrint(arr,0)
# heapSort2(arr)
for t in range((len(arr)-1)//2,-1,-1):
shiftDown(arr,t)
print(arr,"22222222222222")
shiftUp(arr)
print(arr)
下面是索引堆
import random
import numpy as np
def shiftDown(a,i,rev):
if(len(a)>i*2+2):
if(a[i]>a[i*2+1] or a[i]>a[i*2+2] ):
if(a[i*2+1] <a[i*2+2] ):
a[i],a[i*2+1]=a[i*2+1],a[i]
rev[i], rev[i * 2 + 1] = rev[i * 2 + 1], rev[i]
print(rev)
shiftDown(a, i*2+1,rev)
else:
a[i], a[i * 2 + 2] = a[i * 2 + 2], a[i]
rev[i], rev[i * 2 + 2] = rev[i * 2 + 2], rev[i]
print( rev )
shiftDown(a, i*2+2,rev)
elif (len(a)==i*2+2):
if a[i] > a[i * 2 + 1]:
a[i], a[i * 2 + 1] = a[i * 2 + 1], a[i]
rev[i], rev[i * 2 + 1] = rev[i * 2 + 1], rev[i]
print( rev )
arr=[7,12,3,56,7,8,33,5,89,23,234,5,2332,2,45]
rever=np.arange(len(arr))
print(rever)
for t in range((len(arr)-1)//2,-1,-1):
shiftDown(arr[0:len(arr)],t,rever)
for t in range(len(arr)):
print(rever[t],arr[rever[t]])