1.快速排序
快速排序要理解递归在中间的作用
基本原理
1.首先选出一个值作为中间值,将中间值放旁边,在头尾分别放置两个游标
2.头尾游标通过夹逼,得到中间值所在位置,以次为基准,一分为二,这时左侧为小于中间值的数组,右侧为大于中间值的数组
3.在左右数组分别重复上述步骤,直至排序完成
最优时间复杂度O(nlogn)
最坏时间复杂度O(n²)
def quick_sort(alist, first, end):
if first >= end:
return alist
mid_value = alist[first]
low = first
high = end
while low < high:
while low < high and alist[high] >= mid_value:
high -= 1
alist[low] = alist[high]
# 判断不成立,那么high值就是小于中间数的值,故放在low内
while low < high and alist[low] < mid_value:
low += 1
alist[high] = alist[low]
# 判断不成立,那么low值就是大于中间数的值,故放在high内
alist[low] = mid_value
quick_sort(alist, first, low - 1) # 递归循环中间值左侧的数组
quick_sort(alist, low + 1, end) # 递归循环中间值右侧的数组
return
if __name__ == '__main__':
l = [1, 3, 5, 7, 2, 4, 6]
quick_sort(l, 0, len(l) - 1)
print(l)
[1, 2, 3, 4, 5, 6, 7]
2.归并排序
基本原理:
1.将数组对半拆分,将拆分后的数组继续对半拆分,直至每个数据自成一组
2.两两排序何为一组,重复上述步骤,直至合为一组,完成排序
最优与最坏的时间复杂度均为O(nlogn)
def merge_sort(alist):
n = len(alist)
if n <= 1:
return
mid = n // 2
left = merge_sort(alist[:mid])#左右分成两组
right = merge_sort(alist[mid:])
left_point, right_point = 0, 0
result = []
while left_point < len(left) and right_point < len(right):
if left[left_point] < right[right_point]:
result.append(left[left_point])
left_point += 1
else:
result.append(right[right_point])
right_point += 1
result += left[left_point]
result += right[right_point]
return result
3.二分搜索
1.对于数组一分为二,通过特征确定是在哪一部分数据。
2.重复上述步骤,直至查找到
仅使用于有规律数据
最坏时间复杂度O(logn)
def binary_search(alist, item):
n = len(alist)
if n > 0:
mid = n // 2
if alist[mid] == item:
return True
elif item < alist[mid]:
return binary_search(alist[:mid], item)
elif item > alist[mid]:
return binary_search(alist[mid:], item)
return False
if __name__ == '__main__':
l = [1, 2, 3, 4, 5, 6]
print(binary_search(l, 2))