图解算法

1. 数据查找之二分法

  • 对象:数组
  • 使用前提:已排序数组
  • 时间复杂度:O(longn)

如下图我们需要在已排序数组中寻找数字21,我们针对已经排过序的数组可以使用二分法来查找。

大体思路为:

找出现在数组顺序为中间位置(序号6)的值(56),用寻找到的数字和数组中间位置值去比较(图中数组中间的值为56,我们要寻找的是21,21<56),那我们寻找的值就在56左边部分的数组中,我们将这部分数组拿出来作为一个新的数组,继续新数组中间位置的值和需要寻找值的大小比较,通过这种比较,我们每次查找都可以将查找的范围缩小1/2,这种方法也就是常说的二分法,接下来我们用代码来实现;


image
def dichomoty(array, find_num):
    min_index = 0
    max_index = len(array) - 1
    while min_index <= max_index:
        mid = int((min_index + max_index) / 2)
        mid_num = array[mid]
        if mid_num == find_num:
            return mid
        if mid_num > find_num:
            max_index = mid - 1
        else:
            min_index = mid + 1
    return None

array_test = [3,15,19,21,37,56,64,75,80,88,92]
print(dichomoty(array_test, 21))

输出结果为

3
[Finished in 0.8s]

2. 选择排序

将数组元素按照从小到大的顺序排序,每次从数组中取出最小值,新增到另一个数组。

def find_small_num(arr):
    small_num = arr[0]
    small_index = 0
    for i in range(len(arr)):
        if small_num > arr[i]:
            small_num = arr[i]
            small_index = i
    return small_index


def select_sort(arr):
    new_arr = []
    for _ in range(len(arr)):
        small_index = find_small_num(arr)
        new_arr.append(arr.pop(small_index))
    return new_arr


array_test = [3,21,15,92,1,45,33,75,99,88,37]
select_sort(array_test)

输出结果为

[1, 3, 15, 21, 33, 37, 45, 75, 88, 92, 99]

你可能感兴趣的:(图解算法)