算法——简单排序、二分查找及选择排序

简单排序、二分查找及选择排序

algorithm 算法

大O表示法:表达算法的时间复杂性,算最糟糕情况下需要执行的步骤。

简单查找:按顺序逐个查找,需要查找的次数与列表长度相当,所以简单查找的运行时间被称为线性时间(linear tiem),算法复杂性为O(n)。
二分查找(binary_search):在一个包含n个元素的序列(sequence)中,最多需要log n(以2为底)步,二分查找的运行时间被称为对数时间或log时间,算法复杂性为O(log n)。
选择排序(selection_sort):时间复杂性为O(n2),每次找最小值或最大值。

索引(index):元素的位置
数组(array):有序的序列,支持随机访问
链表(linked list):无序,每一个元素都记录了下一个元素的地址,只能顺序访问

数组 链表
读取: O(1) O(n)
插入: O(n) O(1)
删除: O(n) O(1)

要点:
二分查找的速度比简单查找快得多
O(log n)比O(n)快。需要搜索的元素越多,前者比后者快越多
数组的读取速度很快
链表的插入和删除速度很快

# binary_search 二分查找


def simple_search(list, item):
    for i in range(len(list)):
        if list[i] == item:
            return i

    return None


def binary_search(list, item):
        low = 0
        high = len(list)-1

        while low <= high:  # 只要范围没有缩小到只包含一个元素,
            mid = int((low + high)/2)  # 就检查中间的元素
            guess = list[mid]  # 中间值
            if guess == item:  # 找到了
                return mid  # 返回索引
            if guess > item:  # 大了
                high = mid - 1
            else:
                low = mid + 1

        return None  # 元素不在列表中


if __name__ == '__main__':
    li = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9]
    print(simple_search(li, 2))
    print(binary_search(li, 2))
    print(simple_search(li, -1))
    print(binary_search(li, -1))

 

# selection_sort 选择排序


def find_smallest(arr):
    smallest = arr[0]
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index


def selection_sort(arr):
    new_arr = []
    for i in range(len(arr)):
        smallest = find_smallest(arr)
        new_arr.append(arr.pop(smallest))  # 找到arr中的最小值,将其弹出并加入newArr
    return new_arr


if __name__ == '__main__':
    print(selection_sort([15, 3, 6, 2, 10]))

 

posted @ 2019-05-25 13:50  no樂on  阅读(370)  评论(0编辑  收藏  举报