1. # 0、生产一个随机数组、正序
    2. import random
    3. lista = [x for x in range(0, 30)] # 生成一个列表
    4. listA = sorted(random.sample(lista, 10)) # 从中随机抽取10个作为待查找列表
    5. print(listA)
    6. tagval = 16 # 目标值
    7. # 1、顺序查找:遍历
    8. def one(tag, slist):
    9. for i, em in enumerate(slist):
    10. if tag == em:
    11. return i, em
    12. return -1, None
    13. # 2、二分查找:二分法
    14. def two(tag, slist):
    15. start = 0
    16. end = len(slist) - 1
    17. while start <= end:
    18. middle = int((end + start)/2)
    19. if tag == slist[middle]:
    20. return middle, slist[middle]
    21. elif tag < slist[middle]:
    22. end = middle - 1
    23. else:
    24. start = middle + 1
    25. return -1, None
    26. # 2.1、支持重复元素的二分查找
    27. def twoo(tag, slist):
    28. result = []
    29. start = 0
    30. end = len(slist) - 1
    31. while start <= end:
    32. middle = int((end + start) / 2)
    33. if tag == slist[middle]:
    34. if middle > 0 and slist[middle-1] == tag: # 看前一个元素是否=目标元素
    35. for id in range(middle-1, -1, -1):
    36. if slist[id] == tag:
    37. result.append(id)
    38. if middle < end and slist[middle+1] == tag: # 看后一个元素是否=目标元素
    39. for id in range(middle+1, end):
    40. if slist[id] == tag:
    41. result.append(id)
    42. result.append(middle)
    43. return result
    44. elif tag < slist[middle]:
    45. end = middle - 1
    46. else:
    47. start = middle + 1
    48. return -1
    49. print(one(tagval, listA))
    50. print(two(tagval, listA))