数据结构与算法(python)_07_排序查找
2020-07-12 17:39
86 查看
文章目录
排序
归并排序
归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
实现
def merge(left,right): result = [] while left and right: if left[0] < right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) #如果左右任一分组有剩余,将剩余部分全部添加 while left: result.append(left.pop(0)) while right: result.append(right.pop(0)) return result def merge_sort(alist): if len(alist) <= 1: return alist mid = len(alist)//2 left = merge_sort(alist[:mid]) right = merge_sort(alist[mid:]) return merge(left,right)
时间复杂度
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
稳定性:稳定 (左右两边相等的时候,可以保证优先选择左边的,保证顺序)
排序算法总结
可以只掌握两三种,快排必须要掌握。
查找
搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找。
二分查找
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序顺序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
注意:这里查找的列表必须是sorted。
非递归实现
# 非递归实现 def binary_search2(alist, item): start,end = 0,len(alist)-1 # 末尾下标为长度减1 while start <= end: m = start+(end-start)//2 # 数字过大时可能会相加溢出(start+end)//2 if alist[m] == item: return True elif item < alist[m]: end = m-1 #这里等于mid或者mid-1都行 else: start = m+1 #这里等于mid或者mid+1都行 return False
递归实现
# 递归实现 def binary_search(alist, item): if len(alist) > 0: #递归截止条件,需要加判断 mid = len(alist)//2 if alist[mid] == item: return True elif item < alist[mid]: return binary_search(alist[:mid],item) else: return binary_search(alist[mid+1:],item) return False
时间复杂度
最优时间复杂度:O(1)
最坏时间复杂度:O(logn)
相关文章推荐
- 小鱼要学数据结构与算法(基于python)—Day16散列函数设计、冲突解决方案、映射数据类型、排序查找小结
- 小鱼要学数据结构与算法(基于python)—Day11查找和排序之查找
- 如何根据字典值的大小,对字典中的项排序---Python数据结构与算法相关问题与解决技巧...
- 用Python 学习数据结构与算法 三、选择排序
- 用Python 学习数据结构与算法 五、插入排序&二分查找
- 数据结构与算法--查找与排序(一)
- 数据结构与算法专题之查找与排序——静态查找(顺序、二分、哈希)
- 数据结构与算法(六):快速排序的python实现
- python中的查找和排序
- python排序查找
- Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
- 数据结构与算法专题之查找与排序——插入类排序(插入、希尔)
- python数据结构与算法 31 选择排序
- 排序和搜索(一)——python实现顺序查找
- python3 -- 列表操作(排序 查找 清空 反转 计数 扩展)
- python算法与数据结构:07查找
- 数据结构与算法专题之查找与排序——交换类排序(冒泡、快排与归并)
- 用python实现二叉树搜索树/查找树/排序树的验证(判断)(四)(表插入递归)
- 数据结构与算法--查找与排序(二)
- 数据结构与算法之查找、排序、哈希表