排序
冒泡排序
def bubble_sort(a):
for i in range(0, len(a) - 1):
count = 0
for j in range(0, len(a) - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
count += 1
if count == 0:
return
if __name__ == "__main__":
list_a = [4, 9, 5, 3]
bubble_sort(list_a)
print(list_a)
选择排序
def select_sort(a):
for i in range(0, len(a)-1):
max_index = 0
for j in range(1, len(a)-i):
if a[max_index] < a[j]:
max_index = j
a[len(a)-1-i], a[max_index] = a[max_index], a[len(a)-1-i]
if __name__ == "__main__":
list_a = [4, 9, 5, 3]
select_sort(list_a)
print(list_a)
插入排序
def insert_sort(a):
for i in range(1, len(a)):
'''first version
cur = a[i]
for j in range(i-1, -1, -1):
if cur < a[j]:
a[j+1] = a[j]
a[j] = cur
'''
''''second version
for j in range(i, 0, -1):
if a[j] < a[j-1]:
a[j], a[j-1] = a[j-1], a[j]
else:
break
'''
'''third version'''
j = i
while j > 0:
if a[j] < a[j - 1]:
a[j], a[j - 1] = a[j - 1], a[j]
j -= 1
else:
break
if __name__ == "__main__":
list_a = [4, 9, 5, 3]
insert_sort(list_a)
print(list_a)
list_b = [93, 54, 77, 31, 44, 55, 226]
insert_sort(list_b)
print(list_b)
希尔排序
def shell_sort(a, gap):
while gap > 0:
for j in range(gap,len(a)):
i = j
while i >= gap:
if a[i] < a[i - gap]:
a[i], a[i - gap] = a[i - gap], a[i]
i -= gap
else:
break
gap = gap//2
if __name__ == "__main__":
list_a = [4, 9, 5, 3]
shell_sort(list_a, 2)
print(list_a)
list_b = [93, 54, 77, 31, 44, 55, 226]
shell_sort(list_b, 3)
print(list_b)
快速排序
def quick_sort(a, start, end):
# 递归的退出条件
if start >= end:
return
mid_value = a[start]
low_index = start
high_index = end
''' 相遇前:part1 part2 交替执行'''
while low_index < high_index:
'''part1: high_index 移动过程'''
'''考虑特殊的等于情况!这里将等于的元素都放到左边'''
while high_index > low_index and a[high_index] >= mid_value:
high_index -= 1
a[low_index] = a[high_index]
# print("high")
# print(a)
'''part2: low index 移动过程'''
while low_index < high_index and a[low_index] < mid_value:
low_index += 1
a[high_index] = a[low_index]
# print("low")
# print(a)
'''退出循环时, low_index == high_index'''
a[low_index] = mid_value
# print("one round")
# print(a)
# print(low_index)
'''递归
注意:为什么要用start和end参数->直接切片会产生新的列表,而不会修改原有列表!
对基准元素左边的子序列进行快速排序'''
quick_sort(a, start, low_index - 1)
'''对基准元素右边的子序列进行快速排序'''
quick_sort(a, low_index + 1, end)
if __name__ == "__main__":
list_a = [4, 9, 5, 3]
quick_sort(list_a, 0, len(list_a) - 1)
print(list_a)
list_b = [93, 54, 77, 31, 44, 54, 55, 226]
quick_sort(list_b, 0, len(list_b) - 1)
print(list_b)
归并排序
def merge_sort(a):
if len(a) <= 1:
return a
# 二分分解
num = len(a) // 2
left = merge_sort(a[:num])
right = merge_sort(a[num:])
# 合并
# list本身不变!!!!返回了新的list
return merge(left, right)
def merge(a, b):
a_index = 0
b_index = 0
result = []
while a_index < len(a) and b_index < len(b):
if a[a_index] < b[b_index]:
result.append(a[a_index])
a_index += 1
else:
result.append(b[b_index])
b_index += 1
# 注意加上剩下的元素
result += a[a_index:]
result += b[b_index:]
return result
if __name__ == "__main__":
list_a = [4, 9, 5, 3]
print(merge_sort(list_a))
print(list_a)
list_b = [93, 54, 77, 31, 44, 54, 55, 226]
print(merge_sort(list_b))
print(list_b)