算法

查找

  1. 线性查找
    1.   不要求数组为有序数组。其查找算法为对数组中的每个数字与你所需要查找的数字值(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)
  2. 二分查找
    1.   要求数组为有序数组。其查找算法为先将数组从中间劈开,然后比较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)

排序

  1. 冒泡排序
    1.   每一次比较都伴随着交换,看起来像是一个泡泡在不停的向上冒出来,冒出一个最小(或最大)的数字。
       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)
  2. 插入排序
    1.   如你打扑克抓牌,其乱序数组如牌桌上面的牌,而你手中的则为有序区,然后对你抓到的每张牌都进行排序,将其插入到相应的有序位置。
       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)
  3. 选择排序
    1.   第一个数字为有序,记为最小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)
  4. 快速排序
    1.   选取第一个数字,然后将小于它的数字放到左边,大于的数字放到右边。然后分别对左右两边继续进行该递归。
       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)
       

内容待完善...

 

posted @ 2018-07-13 18:40  springy  阅读(235)  评论(0编辑  收藏  举报