算法基础(python版本)

第一章 数据结构

队列

最近的请求次数:https://leetcode.cn/problems/H8086Q/

第二章 算法设计思想

一、搜索排序

1.排序算法

https://visualgo.net/zh/sorting

(1)冒泡排序
# 思路:
# (1)比较相邻元素,如果第一个比第二个大,则交换他们
# (2)第一轮下来,可以保证最后一个数一定是最大的;第二轮下来,可以保证倒数第二个数一定是第二大的。
# (3)执行n-1轮,可以完成排序。
# 比较n-1次?用[3,2,1]冒泡排序后只需要比较2次。
def bubleSort(arr):
    for j in range(len(arr) - 1):
        for i in range(len(arr) - 1):
            if arr[i] > arr[i+1]:
                temp = arr[i]
                arr[i] = arr[i + 1]
                arr[i + 1] = temp

arr = [5, 4, 3, 2, 1]
bubleSort(arr)
print(arr)
(2)选择排序
# 思路:
# (1)找到数组中的最小值,选中它并将其放置在第一位 → 经过第一轮交换,第一个值肯定是最小的。
# (2)接着找到第二小的值,选中必将其放置在第二位 → 经过第二轮交换,第二个值肯定是第二小的。
# 以此类推,交换n-1轮

def selectionSort(arr):
    for i in range(len(arr) - 1):
        indexMin = i
        for j in range(i, len(arr)):
            if arr[j] < arr[indexMin]:
                indexMin = j
        temp = arr[i]
        arr[i] = arr[indexMin]
        arr[indexMin] = temp

arr = [2, 3, 1] # 最坏的情况
selectionSort(arr)
print(arr)

2.搜索算法

http://data.biancheng.net/view/336.html

# 二分插入
# 为什么更新左边界需+1,但是更新右边界却不需要+1?
# 使用了左闭右开的搜索区间,即[l, r)。这意味着左边界l是包含在搜索区间内的,而右边界r是不包含在搜索区间内的。所以,当更新左边界l时,需要加1,因为已经排除了中间元素,而当你更新右边界r时,这不需要加1,因为要保持右边界不包含在搜索区间内。这样做的好处是,当搜索区间为空时,l和r会相等,而且l就是目标元素应该插入的位置。
# 二分查找:从列表中查找元素下标
def binaryInsertIndex(arr, ele):
    if ele not in arr:
        return -1
    l = 0
    r = len(arr) - 1
    while l < r:
        mid = (l + r) // 2
        if ele < arr[mid]:
            r = mid
        else:
            l = mid + 1 # ele不小于arr[mid],意味着ele >= arr[mid],所以需加上1。
    return l

arr = [2,3,6,7]
element = 3
arr.insert(binaryInsertIndex(arr, element), element)
print(arr)

你可能感兴趣的:(最优算法,算法,python,数据结构)