(Python) 非递增顺序排序的 Heapsort 最小堆实现。我究竟做错了什么?
(Python) Heapsort min heap implementation for Non Increasing Order Sorting. What am I doing wrong?
def min_heapify(A,k, n):
left = 2*k +1
right = 2*k +2
n=int(len(A))
if left < n and A[left] < A[k]:
smallest = left
else:
smallest = k
if right< n and A[right] < A[smallest]:
smallest = right
if smallest != k:
A[k], A[smallest] = A[smallest], A[k]
min_heapify(A, smallest, n)
def build_min_heap(A):
n = int((len(A)//2)-1)
for k in range(n, -1, -1):
min_heapify(A,k,n)
def heapsort(A):
n= int(len(A))
build_min_heap(A)
for i in range(n-1, 0, -1):
A[i], A[0] = A[0], A[i]
min_heapify(A, i, 0)
A = [8,7,9,1,4,6,3]
heapsort(A)
print(A)
我得到的输出是:[4, 3, 1, 8, 6, 9, 7] 我希望数组或列表按非递增顺序排序,构建了我的 min_heapify, build_min_heap 函数甚至 heapsort 函数都像默认的伪代码。我在这里做错了什么?请帮帮我
有几个错误。
首先,min_heapify
不能使用n=int(len(A))
,它必须尊重传入的堆的大小。否则,在算法的第二阶段,它会在已排序元素所在的数组,将它们吸收回堆中。
但是,first-and-a-half,当它被修复后,build_min_heap
不再构建 min-heap。那是因为它传递了错误的大小:它传递了 n
,但是 n
在那个上下文中 小于堆大小的一半。以前第一个错误会对此进行补偿,但现在不会了。解决方案:将 len(A)
作为大小传递给这里。
其次,在算法的第二阶段,min_heapify(A, i, 0)
调换了第二个和第三个参数。当然,i
是堆的大小,0
是要堆化的索引,但它们是相反传递的:堆化项 i
of a 0-size heap doesn't甚至说得通。
在我修复了这些东西之后,我得到了正确的结果,但我不敢说现在的代码是bug-free,代码中可能还隐藏着一些我没有找到的东西.
arr = [3,4,5,1,2,3,0,7,8,90,67,31,2,5,567]
# max-heap sort will lead the array to assending order
def maxheap(arr,p):
for i in range(len(arr)-p):
if i > 0:
child = i
parent = (i+1)//2 - 1
while arr[child]> arr[parent] and child !=0:
arr[child], arr[parent] = arr[parent], arr[child]
child = parent
parent = (parent+1)//2 -1
def heapsort(arr):
for i in range(len(arr)):
maxheap(arr,i)
arr[0], arr[len(arr)-i-1]=arr[len(arr)-i-1],arr[0]
return arr
print(heapsort(arr))
看到这个我认为它会对你有所帮助
arr = [3,4,5,1,2,3,7,8,90,67,31,2,5,567]
# inheap_sort will lead the array to descending order using min heap
def minheap(arr,p):
for i in range(len(arr)-p):
if i > 0:
child = i
parent = (i+1)//2 -1
while arr[parent]>arr[child] and child !=0:
arr[parent],arr[child]=arr[child],arr[parent]
child = parent
parent = (parent+1)//2 -1
def heapsort(arr):
for i in range(len(arr)):
minheap(arr,i)
arr[0], arr[len(arr)-i-1]=arr[len(arr)-i-1], arr[0]
return arr
print(heapsort(arr))
此方法适用于最小堆
def min_heapify(A,k, n):
left = 2*k +1
right = 2*k +2
n=int(len(A))
if left < n and A[left] < A[k]:
smallest = left
else:
smallest = k
if right< n and A[right] < A[smallest]:
smallest = right
if smallest != k:
A[k], A[smallest] = A[smallest], A[k]
min_heapify(A, smallest, n)
def build_min_heap(A):
n = int((len(A)//2)-1)
for k in range(n, -1, -1):
min_heapify(A,k,n)
def heapsort(A):
n= int(len(A))
build_min_heap(A)
for i in range(n-1, 0, -1):
A[i], A[0] = A[0], A[i]
min_heapify(A, i, 0)
A = [8,7,9,1,4,6,3]
heapsort(A)
print(A)
我得到的输出是:[4, 3, 1, 8, 6, 9, 7] 我希望数组或列表按非递增顺序排序,构建了我的 min_heapify, build_min_heap 函数甚至 heapsort 函数都像默认的伪代码。我在这里做错了什么?请帮帮我
有几个错误。
首先,min_heapify
不能使用n=int(len(A))
,它必须尊重传入的堆的大小。否则,在算法的第二阶段,它会在已排序元素所在的数组,将它们吸收回堆中。
但是,first-and-a-half,当它被修复后,build_min_heap
不再构建 min-heap。那是因为它传递了错误的大小:它传递了 n
,但是 n
在那个上下文中 小于堆大小的一半。以前第一个错误会对此进行补偿,但现在不会了。解决方案:将 len(A)
作为大小传递给这里。
其次,在算法的第二阶段,min_heapify(A, i, 0)
调换了第二个和第三个参数。当然,i
是堆的大小,0
是要堆化的索引,但它们是相反传递的:堆化项 i
of a 0-size heap doesn't甚至说得通。
在我修复了这些东西之后,我得到了正确的结果,但我不敢说现在的代码是bug-free,代码中可能还隐藏着一些我没有找到的东西.
arr = [3,4,5,1,2,3,0,7,8,90,67,31,2,5,567]
# max-heap sort will lead the array to assending order
def maxheap(arr,p):
for i in range(len(arr)-p):
if i > 0:
child = i
parent = (i+1)//2 - 1
while arr[child]> arr[parent] and child !=0:
arr[child], arr[parent] = arr[parent], arr[child]
child = parent
parent = (parent+1)//2 -1
def heapsort(arr):
for i in range(len(arr)):
maxheap(arr,i)
arr[0], arr[len(arr)-i-1]=arr[len(arr)-i-1],arr[0]
return arr
print(heapsort(arr))
看到这个我认为它会对你有所帮助
arr = [3,4,5,1,2,3,7,8,90,67,31,2,5,567]
# inheap_sort will lead the array to descending order using min heap
def minheap(arr,p):
for i in range(len(arr)-p):
if i > 0:
child = i
parent = (i+1)//2 -1
while arr[parent]>arr[child] and child !=0:
arr[parent],arr[child]=arr[child],arr[parent]
child = parent
parent = (parent+1)//2 -1
def heapsort(arr):
for i in range(len(arr)):
minheap(arr,i)
arr[0], arr[len(arr)-i-1]=arr[len(arr)-i-1], arr[0]
return arr
print(heapsort(arr))
此方法适用于最小堆