冒泡排序:
最优时间复杂度:O(n)
最坏时间复杂度:O(n^2)
稳定性:稳定
def bubble_sort(alist):
"""冒泡排序"""
for j in range(len(alist)-1, 0, -1):
count = 0
for i in range(j):
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
count += 1
if count == 0:
break
return alist
选择排序:
最优时间复杂度:O(n^2)
最坏时间复杂度:O(n^2)
稳定性:不稳定
def choose_sort(alist):
"""选择排序"""
for i in range(len(alist)):
min_x = alist[i]
min_pos = i
for j in range(i+1, len(alist)):
if alist[j] < min_x:
min_x = alist[j]
min_pos = j
alist[min_pos], alist[i] = alist[i], alist[min_pos]
return alist
插入排序:
最优时间复杂度:O(n)
最坏时间复杂度:O(n^2)
稳定性:稳定
def insert_sort(alist):
"""插入排序"""
for j in range(1, len(alist)):
for i in range(j, 0, -1):
if alist[i] < alist[i-1]:
alist[i], alist[i-1] = alist[i-1], alist[i]
else:
break
return alist
希尔排序:
最优时间复杂度:根据步长而调整
最坏时间复杂度:O(n^2)
稳定性:不稳定
def shell_sort(alist):
"""希尔排序"""
gap = len(alist) // 2
#gap到0之前,插入算法执行的次数
while gap >= 1:
#插入算法,与普通插入算法区别在于gap步长
for j in range(gap, len(alist)):
i = j
while i > 0:
if alist[i] < alist[i-gap]:
alist[i], alist[i-gap] = alist[i-gap], alist[i]
i -= gap
else:
break
#调整步长
gap = gap // 2
return alist
快速排序:
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(n^2)
稳定性:不稳定
def quick_sort(alist, first, last):
"""快速排序"""
if first >= last:
return
low = first
high = last
mid = alist[low]
while low < high:
#high 左移
while low < high and alist[high] >= mid:
high -= 1
alist[low] = alist[high]
#low 右移
while low < high and alist[low] < mid:
low += 1
alist[high] = alist[low]
alist[low] = mid
quick_sort(alist, first, low-1)
quick_sort(alist, low+1, last)
归并排序:
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
稳定性:稳定
def merge_sort(alist):
"""归并排序"""
n = len(alist)
if n == 1:
return alist
mid = n // 2
left_li = merge_sort(alist[:mid])
right_li = merge_sort(alist[mid:])
left_pointer, right_pointer = 0, 0
result = []
while left_pointer <len(left_li) and right_pointer < len(right_li):
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result