各种排序算法分类
1、插入排序
1)直接插入法:把列表分两部分,待插入与被插入部分,不断从待插入表中获取元素插入被插入表中
def insert_sort(L):
for i in range(len(L)):
for j in range(i,0,-1):
if L[j] < L[j-1]:
L[j] ,L[j-1] = L[j-1] , L[j]
return L
2)希尔排序法:
def shell_sort(L):
step = len(L)//2
while step>0:
for i in range(step,len(L)):
while i >= step and L[i] < L[i-step]:
L[i],L[i-step] = L[i-step],L[i]
i -= 1
step = step//2
return L
2、选择排序
1)直接选择排序法
def select_sort(L):
for i in range(len(L)):
for j in range(len(L)-1,i,-1):
if L[j-1] > L[j]:
L[j],L[j-1] = L[j-1],L[j]
return L
2)堆排序法
#堆排序属于选择排序
#时间nlogn 空间(1),不稳定
def big_endian(arr,start,end):
root = start
while True:
child = root*2+1
if child > end :
break
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
else :
break
def heap_sort(array):
first = len(array)
for start in range(first-1,-1,-1):
big_endian(array,start,first-1)
for end in range(first-1,0,-1):
array[0],array[end] = array[end],array[0]
big_endian(array,0,end-1)
return array
array = [222,3,45,2,1,0,7,9,7,3,9]
print(heap_sort(array))
3、交换排序
1)冒泡排序
#冒泡排序属于交换排序
#时间复杂度O(n^2),空间O(1),稳定
def bubble_sort(array):
length = len(array)
for i in range(length-1,0,-1):
for j in range(i):
if array[j] > array[j+1]:
array[j],array[j+1] = array[j+1],array[j]
return array
array = [5,8,5,3,22,4,6,8,1]
print(bubble_sort(array))
2)快速排序
#快速排序属于交换排序,
# 平均时间复杂度O(nlogn),
# 空间复杂度O(nlogn),
# 不稳定
#实现代码“分而治之+递归”
def quick_sort(array):
if len(array) <= 1:
return array
else:
mid = array[0]
less_array = [m for m in array[1:] if m < mid]
equ_array = [m for m in array if m == mid]
bigger_array = [m for m in array[1:] if m > mid]
return quick_sort(less_array) + equ_array + quick_sort(bigger_array)
array = [7,6,4,9,5,0,3,1,5,1,9]
print(quick_sort(array))