1.冒泡排序
# -*- coding:utf-8 -*-
def bubble_sort(A):
for i in range(len(A)-1): # 决定进行的轮数
for j in range(0, len(A)-i-1): # 列表下标
if A[j] > A[j+1]:
A[j+1], A[j] = A[j], A[j+1]
return A
A = [0, 5, 4, 3, 2, 1]
print(bubble_sort(A))
2.快速排序
# -*- coding:utf-8 -*-
def partition(A, low, high):
pivot = A[low]
while low < high:
while low < high and A[high] >= pivot:
high -= 1
A[low] = A[high]
while low < high and A[low] <= pivot:
low += 1
A[high] = A[low]
A[low] = pivot
return low
def quick_sort(A, low, high):
if low < high:
pivot = partition(A, low, high)
print(A, low, high)
quick_sort(A, low, pivot-1)
quick_sort(A, pivot+1, high)
return A
A = [3, 5, 4, 8, 2, 1]
print(quick_sort(A, 0, 5))
3.归并排序
分治策略:
• Divide:将n 个元素的序列分成2 个分别有n/2 个元素的序列
• Conquer:假设每个子问题能被解决,实现方法是使用递归调用。
• Merge:将2 个排序好的子序列合并成一个序列,得到原始问题的解。
复杂度:
T(n) = T(n/2) + T(n/2) + cn = O(nlogn)
# -*- coding:utf-8 -*-
def merge_sort(A):
if len(A) == 1:
return A
mid = len(A)//2
left = merge_sort(A[:mid])
right = merge_sort(A[mid:])
return merge(left, right)
def merge(left, right):
result = []
while len(left) > 0 and len(right) > 0:
if left[0] < right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
result += left
result += right
return result
A = [3, 5, 4, 8, 2, 1]
print(merge_sort(A))
4. 插入排序
复杂度:O(n^2)
# -*- coding:utf-8 -*-
def insert_sort(A):
for j in range(len(A)):
key = A[j]
i = j-1
while i >= 0 and A[i] > key:
A[i+1] = A[i]
i -= 1
A[i+1] = key
return A
A = [3, 5, 4, 8, 2, 1]
print(insert_sort(A))