常用算法
# 二分查找 @cal_time def bin_search(li, val): low = 0 high = len(li)-1 while low <= high: # 只要候选区不空,继续循环 mid = (low + high) // 2 if li[mid] == val: return mid elif li[mid] < val: low = mid + 1 else: # li[mid] > val high = mid - 1 return -1 @cal_time def sys_search(li, val): try: return li.index(val) except: return -1 li = list(range(0,20000000,2)) sys_search(li, 20000001)
def _quick_sort(li, left, right): #快速排序方法1 if left < right: # 待排序的区域至少有两个元素 mid = partition(li, left, right) _quick_sort(li, left, mid-1) _quick_sort(li, mid+1, right) @cal_time def quick_sort(li): _quick_sort(li, 0, len(li)-1) def partition(li, left, right): tmp = li[left] while left < right: while left < right and li[right] >= tmp: right -= 1 li[left] = li[right] while left < right and li[left] <= tmp: left += 1 li[right] = li[left] li[left] = tmp return left
def _quick_sort2(li):#快速排序方法2 if len(li) < 2: return li tmp = li[0] left = [v for v in li[1:] if v <= tmp] right = [v for v in li[1:] if v > tmp] left = _quick_sort2(left) right = _quick_sort2(right) return left + [tmp] + right import copy li = list(range(100000)) random.shuffle(li) li2 = copy.copy(li) quick_sort(li) quick_sort2(li2)
# 最好情况O(n) 平均情况O(n^2) 最坏情况O(n^2) @cal_time def bubble_sort(li): for i in range(len(li)-1): # i表示第n趟 一共n或者n-1趟 exchange = False for j in range(len(li)-i-1): # 第i趟 无序区[0, n-i-1] j表示箭头 0~n-i-2 if li[j] > li[j+1]: li[j], li[j+1] = li[j+1], li[j] exchange = True if not exchange: break li = list(range(10000)) random.shuffle(li) bubble_sort(li)