1 排序算法
1.1 直接选择法
依次赋序列中最小值
def SelectSort(src_list):
"""
直接选择法:依次选择最小,放置于该位置
Examples
--------
>>> LIST = [6, 1, 2, 4, 5, 7, 2]
>>> SelectSort(LIST)
[1, 2, 2, 4, 5, 6, 7]
--------
"""
obj_list = src_list
for i in range(len(obj_list) - 1):
index = i
for j in range(i + 1, len(obj_list)):
if obj_list[j] < obj_list[index]:
index = j
obj_list[i], obj_list[index] = obj_list[index], obj_list[i]
return obj_list
1.2 冒泡法
两两比较, 把较大者推到上位
def BubbleSort(src_list):
"""
冒泡
两两比较 把较大者推到上位 O(n)~O(n2)
>>> LIST = [1, 2, 4, 5, 7, 2]
>>> BubbleSort(LIST)
[1, 2, 2, 4, 5, 7]
"""
for i in range(len(src_list) - 1):
for j in range(len(src_list) - 1 - i):
if src_list[j] > src_list[j + 1]:
src_list[j], src_list[j + 1] = src_list[j + 1], src_list[j]
return src_list
1.3 快排法
1.获取列表第一个元素位置index[base],使index[base]左侧 小于等于base,右侧大于等于base
2.分别对左右两子列表再分割
3.迭代
def QuickSort(src_list):
"""
快排
确定list[0]在list中index: 右序搜索小于base 赋给left
左序搜索大于base 赋给right
直至left=right,此时左序列全小,右序列全大
对左半division,对右半division,迭代直至left=right
>>> LIST = [1, 2, 4, 5, 7, 2]
>>> QuickSort(LIST)
[1, 2, 2, 4, 5, 7]
"""
def division(left, right):
nonlocal src_list
base = src_list[left]
while right > left:
while src_list[right] >= base and left < right:
right -= 1
src_list[left] = src_list[right]
while src_list[left] <= base and left < right:
left += 1
src_list[right] = src_list[left]
src_list[left] = base
return left
def qsort(left, right):
nonlocal src_list
if left < right:
i = division(left, right)
qsort(left, i - 1)
qsort(i + 1, right)
qsort(0, len(src_list) - 1)
return src_list
1.4 直接插入排序
思想: 将无序数列依次取出,添加到有序数列中
(梳理手牌)
def InsertSort(src_list):
"""
直接插入法:数列依次取出排序成有序数列,
Examples
--------
>>> LIST = [6, 1, 2, 4, 5, 7, 2]
>>> InsertSort(LIST)
[1, 2, 2, 4, 5, 6, 7]
--------
"""
obj_list = src_list.copy()
for i in range(1, len(obj_list)):
temp = src_list[i]
for j in range(i, -1, -1):
if j >= 1 and obj_list[j-1] > temp:
obj_list[j] = obj_list[j - 1]
else:
obj_list[j] = temp
break
return obj_list