算法图解笔记(一)

346 阅读1分钟

二分查找:

def binary_search(list, item):
    low =  0
    high = len(list)
    while low <= high:
        mid = int((low + high) / 2 + 0.5)  # 为了实现四舍五入加上一个0.5
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid - 1
    return None

大O表示法:

大O表示法指出了算法有多快。

大O表示法指出可最糟情况下的运行时间。

5种大O运行时间(最常见的)

O(logn) 对数时间(二分查找)

O(n) 线性时间(简单查找)

O(n*logn) (快速排序)速度较快

O(n2) (选择排序)速度较快

O(n!) 旅行商问题的解决方法 非常慢的算法

数组和链表:

数组读取速度为常量时间,插入速度为线性时间。

链表读取速度为线性时间,插入速度为常量时间。

数组适合读取操作多,插入操作少的数据。

链表适合插入操作多,读取操作少的数据。

选择排序:(时间复杂度为O(n2))

def findSmallest(arr):  # 用于查找出数组中最小的元素,返回最小元素的索引。
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if smallest > arr[i]:
            smallest = arr[i]
            smallest_index = i
    return smallest_index

def selectSort(arr):
    newArr = []
    while arr:
        smallest = findSmallest(arr)
        newArr.append(arr.pop(smallest))
    return newArr

递归:

递归最重要的就是要确定基线条件和递归条件。

递归的可读性要比循环要好,但是效率不如循环高。

快速排序:

def quickSort(array):
    if len(array) < 2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
        return quickSort(less) + [pivot] + quickSort(greater)