- 01使用二分查找法log(n)
def binary_search(list, item):
# low and high keep track of which part of the list you'll search in.
low = 0
high = len(list) - 1
# While you haven't narrowed it down to one element ...
while low <= high:
# ... check the middle element
mid = (low + high) // 2
guess = list[mid]
# Found the item.
if guess == item:
return mid
# The guess was too high.
if guess > item:
high = mid - 1
# The guess was too low.
else:
low = mid + 1
# Item doesn't exist
return None
my_list = [1, 3, 5, 7, 9]
print(binary_search(my_list, 3)) # => 1
# 'None' means nil in Python. We use to indicate that the item wasn't found.
print(binary_search(my_list, -1)) # => None
- 02 选择排序(log(n**2))
# Finds the smallest value in an array
def findSmallest(arr):
# Stores the smallest value
smallest = arr[0]
# Stores the index of the smallest value
smallest_index = 0
for i in range(1, len(arr)):
if arr[i] < smallest:
smallest_index = i
smallest = arr[i]
return smallest_index
# Sort array
def selectionSort(arr):
newArr = []
for i in range(len(arr)):
# Finds the smallest element in the array and adds it to the new array
smallest = findSmallest(arr)
newArr.append(arr.pop(smallest))
return newArr
print(selectionSort([5, 3, 6, 2, 10]))
03
- 使用递归倒计时
def countdown(i):
# base case
if i <= 0:
return 0
# recursive case
else:
print(i)
return countdown(i-1)
countdown(5)
- 调用栈
def greet2(name):
print("how are you, ", name, "?")
def bye():
print("ok bye!")
def greet(name):
print("hello, ", name, "!")
greet2(name)
print("getting ready to say bye...")
bye()
greet("adit")
- 递归调用栈
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
print(fact(5))
04
- 编写sum函数
def sum(arr):
total = 0
for x in arr:
total += x
return total
print(sum([1, 2, 3, 4]))
- 使用递归函数计算列表中的元素
def sum(list):
if list == []:
return 0
return list[0] + sum(list[1:])
- 使用递归函数计算列表中的元素数
def count(list):
if list == []:
return 0
return 1 + count(list[1:])
- 找出列表中的最大值
def max_(lst):
if len(lst) == 0:
return None
if len(lst) == 1:
return lst[0]
else:
sub_max = max_(lst[1:])
return lst[0] if lst[0] > sub_max else sub_max
- 快速排序(分而治之)(nlog(n))
def quicksort(array):
if len(array) < 2:
# base case, arrays with 0 or 1 element are already "sorted"
return array
else:
# recursive case
pivot = array[0]
# sub-array of all the elements less than the pivot
less = [i for i in array[1:] if i <= pivot]
# sub-array of all the elements greater than the pivot
greater = [i for i in array[1:] if i > pivot]
return quicksort(less) + [pivot] + quicksort(greater)
print(quicksort([10, 5, 2, 3]))
05
- python 、散列表、字典
book = {"apple": 0.67, "milk": 1.49, "avocado": 1.49}
print(book)
- 防止重复出现重复的记录
voted = {}
def check_voter(name):
if voted.get(name):
print("kick them out!")
else:
voted[name] = True
print("let them vote!")
check_voter("tom")
check_voter("mike")
check_voter("mike")
06 广度优先搜索
from collections import deque
#在python中用函数deque来创建一个双端队列
def person_is_seller(name):
return name[-1] == 'm' #名字结尾处是否是以m结尾
graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []
def search(name):
search_queue = deque() #创建一个队列
search_queue += graph[name] #将邻居加入这个搜索队列中
# This array is how you keep track of which people you've searched before.
searched = []
while search_queue:
person = search_queue.popleft()
# Only search this person if you haven't already searched them.
if person not in searched:
if person_is_seller(person):
print(person + " is a mango seller!")
return True
else:
search_queue += graph[person]
# Marks this person as searched
searched.append(person)
return False