插入排序
"""
插入排序核心思想 将数组分成一个有序数组和一个无序数组 每次从无序数组中提一个元素出来 插入到 有序元素的合适位置
"""
from typing import List
def insert_sort(arr: List) -> List:
"""
插入排序
:param arr:
:return:
"""
target = []
l = len(arr)
for i in range(l):
insert_index = 0
for j in range(len(target)):
if arr[j] >= arr[i]:
break
insert_index += 1
target.insert(insert_index, arr[i])
return target
def insert_sort_by_org_arr(arr: List) -> List:
"""
插入排序 原数组上改
:param arr:
:return:
"""
l = len(arr)
for i in range(l):
insert_index = i - 1
insert_val = arr[i]
while insert_index >= 0 and arr[insert_index] > insert_val:
arr[insert_index + 1] = arr[insert_index]
insert_index -= 1
arr[insert_index + 1] = insert_val
if __name__ == '__main__':
arr = [4, 1, 5, 7, 6, -1, 55, -55, 666]
print(insert_sort(arr))
insert_sort_by_org_arr(arr)
print(arr)
希尔排序
from typing import List
def shell_sort_by_swap(arr: List) -> List:
"""
希尔排序是对直接插入排序的改进,直接插入排序的缺点在于如果从小到大排序,但是最小数在很后面,
这样会造成大量的数据移位操作,希尔排序核心思想将数组平均分成2组之后进行直接插入排序,然后一直分组到最后只能分成一组的时候结束,
分组的方式是通过步长来进行分组。希尔排序分组的方式使得尽快的让小的数放在前面,大的放在后面,减少移动的次数。
:param arr:
:return:
"""
n = len(arr)
gap = n // 2
while gap > 0:
for i in range(gap, n):
for j in range(i - gap, -1, -gap):
if arr[j] > arr[j + gap]:
arr[j], arr[j + gap] = arr[j + gap], arr[j]
gap = gap // 2
if __name__ == '__main__':
arr = [4, 1, 5, 7, 6, -1, 55, -55, 666]
shell_sort_by_swap(arr)
print(arr)