算法——简单排序、二分查找及选择排序
简单排序、二分查找及选择排序
algorithm 算法
大O表示法:表达算法的时间复杂性,算最糟糕情况下需要执行的步骤。
简单查找:按顺序逐个查找,需要查找的次数与列表长度相当,所以简单查找的运行时间被称为线性时间(linear tiem),算法复杂性为O(n)。
二分查找(binary_search):在一个包含n个元素的序列(sequence)中,最多需要log n(以2为底)步,二分查找的运行时间被称为对数时间或log时间,算法复杂性为O(log n)。
选择排序(selection_sort):时间复杂性为O(n2),每次找最小值或最大值。
索引(index):元素的位置
数组(array):有序的序列,支持随机访问
链表(linked list):无序,每一个元素都记录了下一个元素的地址,只能顺序访问
数组 链表
读取: O(1) O(n)
插入: O(n) O(1)
删除: O(n) O(1)
要点:
二分查找的速度比简单查找快得多
O(log n)比O(n)快。需要搜索的元素越多,前者比后者快越多
数组的读取速度很快
链表的插入和删除速度很快
# binary_search 二分查找 def simple_search(list, item): for i in range(len(list)): if list[i] == item: return i return None def binary_search(list, item): low = 0 high = len(list)-1 while low <= high: # 只要范围没有缩小到只包含一个元素, mid = int((low + high)/2) # 就检查中间的元素 guess = list[mid] # 中间值 if guess == item: # 找到了 return mid # 返回索引 if guess > item: # 大了 high = mid - 1 else: low = mid + 1 return None # 元素不在列表中 if __name__ == '__main__': li = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9] print(simple_search(li, 2)) print(binary_search(li, 2)) print(simple_search(li, -1)) print(binary_search(li, -1))
# selection_sort 选择排序 def find_smallest(arr): smallest = arr[0] smallest_index = 0 for i in range(1, len(arr)): if arr[i] < smallest: smallest = arr[i] smallest_index = i return smallest_index def selection_sort(arr): new_arr = [] for i in range(len(arr)): smallest = find_smallest(arr) new_arr.append(arr.pop(smallest)) # 找到arr中的最小值,将其弹出并加入newArr return new_arr if __name__ == '__main__': print(selection_sort([15, 3, 6, 2, 10]))
Resistance is Futile!