简单排序、二分查找及选择排序
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]))