您的位置:首页 > 其它

算法导论:堆排序

2017-06-24 17:21 218 查看

堆排序

代码(python 2)只是实现了堆排序的核心代码:堆维护性质(max_heapify),而后的建堆、及排序都是基于堆得维护性质算法进行调用即可,暂时不做详解。

注意:

为了和书中的伪代码一致,对堆(以数组的形式表示)的操作从数组的第二个元素array[1]开始,第一个元素不作处理初始为0。

堆维护性质算法

1、基于递归实现:

"""
warning:
1, This codes are based on chapter 6 of Introduction to Algorithms, so the array[0] to be
initialized 0, and ignore array[0].
2, The second element, array[1], will be treated as the root of the heap.
3, At beginning, the heap_size = len(array)-1 because we don't operate array[0].
"""

'''
此时的Heap类暂时使用不到
'''
class Heap:
def __init__(self, array, list_length, heap_size):
self.A = array
self.list_length = list_length
self.heap_size = heap_size

def heap_size_del(self):
self.heap_size -= 1

def left(i):
return 2*i

def right(i):
return 2*i + 1

def max_heapify_recursion(array, i, heap_size):
if (i > heap_size/2) or (array[i] > array[left(i)] and array[i] > array[right(i)]):
return
largest = i
if i <= heap_size / 2 and array[i] < array[left(i)]:
largest = left(i)
if i <= heap_size / 2 and array[largest] < array[right(i)]:
largest = right(i)
if largest != i:
temp = array[i]
array[i] = array[largest]
array[largest] = temp
max_heapify_recursion(array, largest, heap_size)


实验如下:

heap = [0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1]
print heap
max_heapify_recursion(heap, 2, 10)
print heap


结果:

[0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1]
[0, 16, 14, 10, 8, 7, 9, 3, 2, 4, 1]


2、非递归实现:

def max_heapify(array, i, heap_size):
check = True
if (i > heap_size/2) or (array[i] > array[left(i)] and array[i] > array[right(i)]):
return
while check:
largest = i
if (i > heap_size/2) or (array[i] > array[left(i)] and array[i] > array[right(i)]):
break
elif i <= heap_size/2 and array[i] < array[left(i)]:
largest = left(i)
elif i <= heap_size/2 and array[largest] < array[right(i)]:
largest = right(i)
if largest != i:
temp = array[i]
array[i] = array[largest]
array[largest] = temp
i = largest


实验相同略过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息