一、算法常考点
排序+查找,重中之重
1.常考排序算法:冒泡排序、快速排序、归并排序、堆排序
2.线性查找、二分查找等
3.能独立实现代码(手写),能够分析时间空间复杂度
二、常用排序算法时空复杂度
排序算法 | 最差时间分析 | 平均时间复杂度 | 稳定性 | 空间复杂度 |
---|---|---|---|---|
冒泡排序 | O(n^2) |
O(n^2) |
稳定 | O(1) |
选择排序 | O(n^2) |
O(n^2) |
不稳定 | `O(1) |
插入排序 | O(n^2) |
O(n^2) |
稳定 | `O(1) |
快速排序 | O(n^2) |
O(n*log2n) |
不稳定 | O(log2n)~O(n) |
堆排序 | O(n*log2n) |
O(n*log2n) |
不稳定 | O(1) |
三、排序算法中的稳定性
什么是排序算法的稳定性?
1.相同大小的元素在排序之后依然保持相对位置不变,就是稳定的
2.r[i] = r[j]
且 r[i]
在r[j]
之前,排序之后 r[i]
依然在 r[j]
之前
3.稳定性对于排序一个复杂结构,并且需要保持原有排序才有意义
四、请写出快速排序
快排经常问:分治法(divide and conquer
)快排分三步走
1.Partition
:选择基准分割数组为两个子数组,小于基准和大于基准的
2.对两个子数组分别快排
3.合并结果
代码示例:
def quick_sort(arr):
# 递归出口,空数组或者只有一个元素的数组都是有序的
if len(array) < 2:
return array
else:
pivot_index = 0 # 第一个元素作为 pivot(主元)
pivot = array[pivot_index]
less_part = [
i for i in array[pivot_index+1:] if i <= pivot
]
great_part = [
i for i in array[pivot_index+1:] if i > pivot
]
return quick_sort(less_part) + [pivot] + quick_sort<