算法
查找
- 线性查找
- 不要求数组为有序数组。其查找算法为对数组中的每个数字与你所需要查找的数字值(target)挨着进行比较。
1 def line_search(data, target): 2 for i in range(len(data)): 3 if data[i] == target: 4 return i 5 return None 6 7 8 if __name__ == '__main__': 9 ls = [2, 8, 7, 6, 3, 5, 9] 10 res = line_search(ls, 3) 11 print('所在列表的位置:', res)
- 不要求数组为有序数组。其查找算法为对数组中的每个数字与你所需要查找的数字值(target)挨着进行比较。
- 二分查找
- 要求数组为有序数组。其查找算法为先将数组从中间劈开,然后比较value与数组的劈开那的值比较,即与中值进行比较,若value<中值,则去小于中值的那部分,继续递归该过程;若大于,则去大于那部分递归;若等于中值,则查找结束。
1 def binary_search(data, target): 2 low = 0 3 high = len(data) - 1 4 while low <= high: 5 mid = (low + high) // 2 6 if data[mid] == target: 7 return mid 8 elif data[mid] > target: 9 high = mid - 1 10 else: 11 low = low + 1 12 return None 13 14 15 if __name__ == '__main__': 16 ls = range(2, 20) 17 res = binary_search(ls, 4) 18 print('所在列表的位置', res)
- 要求数组为有序数组。其查找算法为先将数组从中间劈开,然后比较value与数组的劈开那的值比较,即与中值进行比较,若value<中值,则去小于中值的那部分,继续递归该过程;若大于,则去大于那部分递归;若等于中值,则查找结束。
排序
- 冒泡排序
- 每一次比较都伴随着交换,看起来像是一个泡泡在不停的向上冒出来,冒出一个最小(或最大)的数字。
1 import random 2 3 4 def bubble_sort(data): 5 for i in range(len(data)-1): 6 for j in range(len(data) - i - 1): 7 if data[j] > data[j + 1]: 8 data[j], data[j + 1] = data[j + 1], data[j] 9 10 11 if __name__ == '__main__': 12 ls = list(range(10)) 13 random.shuffle(ls) 14 print('混乱的状态',ls) 15 bubble_sort(ls) 16 print('排序状态',ls)
- 每一次比较都伴随着交换,看起来像是一个泡泡在不停的向上冒出来,冒出一个最小(或最大)的数字。
- 插入排序
- 如你打扑克抓牌,其乱序数组如牌桌上面的牌,而你手中的则为有序区,然后对你抓到的每张牌都进行排序,将其插入到相应的有序位置。
1 import random 2 3 4 def insertion_sort(data): 5 for i in range(1, len(data)): 6 tmp = data[i] 7 j = i - 1 8 while j >= 0 and data[j] > tmp: 9 data[j + 1] = data[j] 10 j -= 1 11 data[j + 1] = tmp 12 13 14 if __name__ == '__main__': 15 ls = list(range(10)) 16 random.shuffle(ls) 17 print('混乱状态', ls) 18 insertion_sort(ls) 19 print('有序状态', ls)
- 如你打扑克抓牌,其乱序数组如牌桌上面的牌,而你手中的则为有序区,然后对你抓到的每张牌都进行排序,将其插入到相应的有序位置。
- 选择排序
- 第一个数字为有序,记为最小min,然后与数组中其他数字进行比较,若找到比其还小的数字,则将找到的那个数字标记为loc_min,直到遍历完数组。然后交换第一个数字与找到的最小数字。依次对下一个数字进行排序
1 import random 2 3 4 def selection_sort(data): 5 for i in range(len(data) - 1): # 由于经过前面一系列的排序,最后的数字必然是最小(或最大)的,即有序 6 loc_min = i 7 for j in range(i + 1, len(data)): 8 if data[j] < data[loc_min]: 9 loc_min = j 10 data[loc_min], data[i] = data[i], data[loc_min] 11 12 13 if __name__ == '__main__': 14 ls = list(range(10)) 15 random.shuffle(ls) 16 print('混乱状态', ls) 17 selection_sort(ls) 18 print('排序状态', ls)
- 第一个数字为有序,记为最小min,然后与数组中其他数字进行比较,若找到比其还小的数字,则将找到的那个数字标记为loc_min,直到遍历完数组。然后交换第一个数字与找到的最小数字。依次对下一个数字进行排序
- 快速排序
- 选取第一个数字,然后将小于它的数字放到左边,大于的数字放到右边。然后分别对左右两边继续进行该递归。
1 import random 2 3 4 def quick_sort(data, left, right): 5 if left < right: 6 mid = partition(data, left, right) 7 quick_sort(data, left, mid - 1) 8 quick_sort(data, mid + 1, right) 9 10 11 def partition(data, left, right): 12 tmp = data[left] 13 while left < right: 14 while left < right and data[right] > tmp: 15 right -= 1 16 data[left] = data[right] 17 while left < right and data[left] < tmp: 18 left += 1 19 data[right] = data[left] 20 data[left] = tmp 21 return left 22 23 if __name__ == '__main__': 24 ls = list(range(20)) 25 random.shuffle(ls) 26 print('混乱状态', ls) 27 quick_sort(ls, 0, len(ls) - 1) 28 print('排序状态', ls)
- 选取第一个数字,然后将小于它的数字放到左边,大于的数字放到右边。然后分别对左右两边继续进行该递归。
内容待完善...
talk is cheap show me the code