算法:
排序算法:
堆排序:
堆排序(Heap sort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点,即小根堆(大根堆)。
#python3实现
def big_endian(arr,start,end):
root=start
child=root*2+1 #表示左孩子
while child<=end:
#孩子比最后一个节点还大,也就意味着最后一个叶子节点了,就得跳出去一次循环,已经调整完毕
if child+1<=end and arr[child]<arr[child+1]:
#为了始终让其跟子元素的较大值比较,如果右边大就左换右,左边大的话就默认
child+=1
if arr[root]<arr[child]:
#父节点小于子节点直接交换位置,同时坐标也得换,这样下次循环可以准确判断:是否为最底层,
#是不是调整完毕
arr[root],arr[child]=arr[child],arr[root]
root=child
child=root*2+1
else:
break
def heap_sort(arr): #无序区大根堆排序
first=len(arr)//2 - 1
for start in range(first,-1,-1):
#从下到上,从左到右对每个节点进行调整,循环得到非叶子节点
big_endian(arr,start,len(arr)-1) #去调整所有的节点
for end in range(len(arr)-1,0,-1):
arr[0],arr[end]=arr[end],arr[0] #顶部尾部互换位置
big_endian(arr,0,end-1) #重新调整子节点的顺序,从顶开始调整
return arr
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
def shell_sort(alist):
"""希尔排序法"""
n = len(alist)
# 初始步长
gap = n // 2 #折半设定,若n=9,则gap=4
while gap > 0: #gap=1进行最后一次循环
# 按步长进行插入排序
for j in range(gap, n):#从gap开始,控制子序列中的所有元素
i = j
# 插入排序
while i > 0:
if alist[i] < alist[i-gap]:
alist[i-gap], alist[i] = alist[i], alist[i-gap] #gap为步长
i -= gap
else:
break
gap = gap // 2 # 得到新的步长