1.二分查找算法
(递归)
def binary_search(al,item):
"""binary_search"""
n = len(al)
if n > 0:
mid = n//2
if al[mid] == item:
return True
elif item < al[mid]:
return binary_search(al[:mid],item)
else:
return binary_search(al[mid+1:],item)
return False
if __name__ == "__main__":
al = [24,27,38,44,49,66,73,89,93]
print(binary_search(al,93))
(非递归)
def binary_search(al,item):
"""binary_search"""
n = len(al)
first = 0
last = n - 1
while first <= last:
mid = (first + last) // 2
if al[mid] == item:
return True
elif item < al[mid]:
last = mid - 1
else:
first = mid + 1
return False
if __name__ == "__main__":
al = [24,27,38,44,49,66,73,89,93]
print(binary_search(al,93))
2.归并排序
算法思想:
将一行数字,在中间进行分裂成两部分,两两分开,以此递归。
当各自为队伍时,两两组队比对大小并排序,以此类推。
Eg:
一 83461479
二 8346 1497
三 83 46 14 97
四 8 3 4 6 1 4 9 7
五 38 46 14 79
六 3468 1479
-----| -----| 游标
左边的游标在第一位处与后面的右边所在的第一位处比较,将小的拿出来,拿出来后,游标后移一位,以此类推
七 13446789
代码
# coding:utf-8
def merger_sort(alist):
"""merger sort"""
n = len(alist)
if n <= 1:
return alist
mid = n // 2
#it will be create a new list after merger sort in left
left_li = merger_sort(alist[:mid]) # it can not contaion the alist[mid]
#it will be create a new list after merger sort in right
right_li = merger_sort(alist[mid:]) # it can contaion the alist[mid]
#maka a new list that use the ordered sequence
left_pointer , right_pointer = 0 , 0
result = []
while left_pointer < len(left_li) and right_pointer <= len(right_li):
if left_li[left_pointer] < right_li[right_pointer]:
result.append(left_li[left_pointer])
left_pointer += 1
else:
result.append(right_li[right_pointer])
right_pointer += 1
result += left_li[left_pointer:]
result += right_li[right_pointer:]
return result
if __name__ == "__main__":
alist = [24,27,38,44,49,66,73,89,93]
result = merger_sort(alist)
print(result)