1.希尔排序
希尔排序是间隔一个递减数列的数据比如说{8,4,2,1}中的一个数比较大小,满足条件就交换位置。
def shell_sort(text):
n = len(text)
x= n // 2
while x>= 1:
for j in range(x,n):
i = j
while(i - x) >= 0:
if text[i] < text[i-x]:
text[i-x],text[i] = text[i],text[i-x]
i -= x
else:
break
x//=2 #间隔递减
return text
2.插入排序
插入排序构建一个有序序列,把未排序序列中的数字,在已排序序列从后往前比较大小,更换位置。
def insert_sort(nums):
if len(nums)<2:
return nums
for i in range(len(nums)):
index = i-1
mid = nums[i]
while index >= 0 and nums[index] > mid:
nums[index+1] = nums[index]
index -= 1
nums[index+1] = mid
return nums
3.冒泡排序
冒泡排序是遍历len(nums)遍数组,每次遍历将两个顺序不对的元素调换位置
def bubble_sort(nums):
for i in range(1,len(nums)):
for j in range(len(nums)-1-i):
# print(nums)
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
return nums
4.堆排序
堆排序先建立一个堆,将数据自顶向下填入堆调整为大根堆(父节点大于左右子节点),然后从右至左开始将最小子节点与根节点调换,因为是大根堆所以根节点一定是最大值,然后每次都将未排序的树调整成大根堆,所以每次根节点调换是都是最大值放到了当前最靠近右边子节点的位置。
具体可以看,超级详细——菜鸟教程堆排序
def heap_sort(nums):
def adjust_heap(nums, root, numsize):
pos = root
left = pos * 2 + 1
right = left + 1
if left < numsize:
if nums[pos] < nums[left]:
pos = left
if right < numsize:
if nums[pos] < nums[right]:
pos = right
if pos != root:
nums[pos], nums[root] = nums[root], nums[pos]
adjust_heap(nums, pos, numsize)
n = len(nums)
for i in reversed(range(n // 2)):
adjust_heap(nums, i, n)
print(nums)
# 调整堆
for i in range(n - 1, -1, -1):
nums[0], nums[i] = nums[i], nums[0]
adjust_heap(nums, 0, i)
return nums
2020.07.06更新————————————————
从大佬这里翻到一个打印树的牛批代码__传送门
def print_tree(array): #打印堆排序使用
'''
深度 前空格 元素间空格
1 7 0
2 3 7
3 1 3
4 0 1
'''
# first=[0]
# first.extend(array)
# array=first
index = 0
depth = math.ceil(math.log2(len(array))) # 因为补0了,不然应该是math.ceil(math.log2(len(array)+1))
sep = ' '
for i in range(depth):
offset = 2 ** i
print(sep * (2 ** (depth - i - 1) - 1), end='')
line = array[index:index + offset]
for j, x in enumerate(line):
print("{:>{}}".format(x, len(sep)), end='')
interval = 0 if i == 0 else 2 ** (depth - i) - 1
if j < len(line) - 1:
print(sep * interval, end='')
index += offset
print()