Python 算法讲解

分类:N05_python

标签:

序号目录时间备注
P101 算法入门概念06:422024-03-06
P202 估算法运行效率与时间复杂度17:052024-03-06
P303 简单判断时间复杂度01:332024-03-06
P404 空间复杂度03:032024-03-06
P505 递归06:062024-03-06
P606 汉诺塔问题15:41
def hanoi(n, a, b, c):
    if n>0:
        hanoi(n-1, a, c, b)
        print("moving from %s to %s" % (a, c))
        hanoi(n-1, b, a, c)
P707 顺序查找04:25
def linear_search(li, val):
    for ind, v in enumerate(li):
        if v==val:
            return ind
    else:
        return None
P809二分查找介绍10:03
P910二分查找代码04:44
# 二分查找
def binary_search(li, val):
    left = 0
    right = len(li)-1
    while left <= right:
        mid = (left+right)//2
        if li[mid] == val:
            return mid
        elif li[mid] > val:
            left = mid - 1
        else:
            right = mid + 1
    else:
        return  None

li = [1, 3, 5, 6, 7, 9]
print(binary_search(li, 5)
P1011二分查找与线性查找的比较11:35
P1112排序介绍02:30
P1213冒泡排序介绍07:42
# 冒泡排序
def bubble_sort(li):
    for i in range(len(li)-1):
        exchange = False
        for j in range(len(li)-1-i):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]
                exchange = True
        if not exchange:
            return li
    return li

li = [9, 1, 5, 6, 8, 4, 2]
print(li)
print(bubble_sort(li)
P1314冒泡排序10:12
P1415选择排序18:13
# 选择排序
def select_sort(li):
    for i in range(len(li)-1):
        min_loc = i
        for j in range(i+1, len(li)):
            if  li[j] < li[min_loc]:
                min_loc =j
        li[i], li[min_loc] = li[min_loc], li[i]
    return li
P1516插入排序19:04
# 插入排序
def insert_sort(li):
    for i in range(1, len(li)):
        tmp = li[i] # 选择的要插入的牌
        j = i-1 # 手里已经排好序的牌的前一张
        while j>=0 and tmp<li[j]:
            li[j+1] = li[j]
            j -= 1
        li[j+1] = tmp
        print(li)
    return li

li = [4, 8, 0, 1, 5, 7]
print(li)
print(insert_sort(li)
P1617快速排序原理介绍10:47
P1718快速排序代码实现20:52
# 快排的归为操作
def partition(li, left, right):
    print('kaishi')
    tmp = li[left]
    while left<right:
        # 先从右边开始找
        while li[right] >= tmp and left<right:
            right -= 1
        li[left] = li[right]
        # 再从左边开始找
        while left<right and li[left] <= tmp:
            left += 1
        li[right] = li[left]
    li[left] = tmp
    print(li)
 
print(li)
partition(li, 0, len(li)-1
P1819快速排序代码实现217:43
def partition(li, left, right):
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp: #从右面找比tmp小的数
            right -= 1      # 往左走一步
        li[left] = li[right] #把右边的值写到左边空位上
        # print(li, 'right')
        while left < right and li[left] <= tmp:
            left += 1
        li[right] = li[left] #把左边的值写到右边空位上
        # print(li, 'left')
    li[left] = tmp      # 把tmp归位
    return left


def _quick_sort(li, left, right):
    if left<right:  # 至少两个元素
        mid = partition(li, left, right)
        _quick_sort(li, left, mid-1)
        _quick_sort(li, mid+1, right)

@cal_time
def quick_sort(li):
    _quick_sort(li, 0, len(li)-1)

li = list(range(10000, 0, -1))
# random.shuffle(li)
#
# li1 = copy.deepcopy(li)
# li2 = copy.deepcopy(li)
#
quick_sort(li)
# bubble_sort(li2)
#
# print(li1)
# print(li2)

# li = [9,8,7,6,5,4,3,2,1]
# partition(li, 0, len(li)-1)
# print(li
P1920堆排序前传树的基础知识05:33
P2021堆排序前传二叉树的基础知识10:22
P2122堆排序前传堆和堆的向下调整07:31
P2223堆排序的过程演示10:52
P2324向下调整函数的实现26:06
def sift(li, low, high):
    """
    :param li: 列表
    :param low: 堆的根节点位置
    :param high: 堆的最后一个元素的位置
    :return: 
    """
    i = low # i最开始指向根节点
    j = 2 * i + 1 # j开始是左孩子
    tmp = li[low] # 把堆顶存起来
    while j <= high: # 只要j位置有数
        if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子有并且比较大
            j = j + 1  # j指向右孩子
        if li[j] > tmp:
            li[i] = li[j]
            i = j           # 往下看一层
            j = 2 * i + 1
        else:       # tmp更大,把tmp放到i的位置上
            li[i] = tmp     # 把tmp放到某一级领导位置上
            break
    else:
        li[i] = tmp  # 把tmp放到叶子节点
P2425堆排序的实现(1)11:34
def heap_sort(li):
    n = len(li)
    for i in range((n-2)//2, -1, -1):
        # i表示建堆的时候调整的部分的根的下标
        sift(li, i, n-1)
    # 建堆完成了
    for i in range(n-1, -1, -1):
        # i 指向当前堆的最后一个元素
        li[0], li[i] = li[i], li[0]
        sift(li, 0, i - 1) #i-1是新的high


li = [i for i in range(100)]
import random
random.shuffle(li)
print(li)

heap_sort(li)
print(li
P2526堆排序的实现(2)06:45
P2627堆排序的时间复杂度02:06
P2728堆的内置模块06:23
P2829topk问题10:53
P2930topk实现08:22
def topk(li, k):
    heap = li[0:k]
    for i in range((k-2)//2, -1, -1):
        sift(heap, i, k-1)
    # 1.建堆
    for i in range(k, len(li)-1):
        if li[i] > heap[0]:
            heap[0] = li[i]
            sift(heap, 0, k-1)

    # 2.遍历
    for i in range(k-1, -1, -1):
        heap[0], heap[i] = heap[i], heap[0]
        sift(heap, 0, i - 1)
    # 3.出数
    return heap

import random
li = list(range(1000))
random.shuffle(li)

print(topk(li, 10)
P3031归并排序实现11:48
P3132归并排序归并11:11
P3233归并排序复杂度讨论03:34
P3334NB三人组小结12:28
P3435希尔排序10:31
P3536希尔排序讨论04:13
P3637计数排序13:24
P3738桶排序介绍04:59
P3839桶排序实现19:48
P3940基数排序介绍09:12
P4041基数排序实现23:39
P4142查找排序部分习题06:12
P4243查找排序习题111:17
P4344查找排序习题215:08
P4445查找排序习题317:00
P4546查找排序习题408:39
P4647数据结构介绍06:37
P4748列表17:44
P4849栈的介绍08:04
P4950栈的应用:括号匹配问题14:58
P5051队列的介绍15:56
P5152队列的实现12:17
P5253队列的内置模块12:04
P5354栈和队列的应用:迷宫问题07:42
P5455使用栈解决迷宫问题14:03
P5556队列进行迷宫问题:介绍12:25
P5657队列进行迷宫问题:实现16:52
P5758 链表介绍04:30
P5859 链表创建和遍历08:45
P5960 链表的插入和删除04:49
P6061 双链表03:13
P6162 链表总结04:25
class Node:
   def __init__(self, item):
      self.item = item
      self.next = None

def create_linklist_tail(li):
   head = Node(li[0])
   tail = head
   for element in li[1:]:
      node = Node(element)
      tail.next = node
      tail = node
   return head

def print_linklist(lk):
   while lk:
      print(lk.item, end=",")
      lk = lk.next

li = [1, 2, 3, 4, 6]
lk = create_linklist_tail(li)
print_linklist(lk)
P6263 哈希表20:59
P6364 哈希表实现16:10
P6465 哈希表应用12:18
P6566 树的概念04:09
P6667 树的实例:模拟文件系统18:22
P6768 二叉树的概念05:14
P6869 二叉树的遍历17:35
P6970 二叉搜索树的概念04:33
P7071 二叉搜索树:插入15:59
P7172 二叉搜索树:查询05:11
P7273 二叉搜索树:删除04:21
P7374 二叉搜索树:删除实现22:47
P7475 AVL树的概念06:26
P7576 AVL:旋转11:01
P7677 AVL:旋转实现112:24
P7778 AVL:旋转实现217:30
P7880 AVL:插入42:06
P7981 AVL树应用与数据结构总结11:46
P8083 贪心算法(算法进阶)09:14
P8184 分数背包08:23
P8285 分数背包实现13:07
P8386 数字拼接问题06:18
P8487 数字拼接问题实现06:49
# 数字拼接问题
from functools import cmp_to_key

li = [32, 94, 128, 1286, 6, 71]

def xy_cmp(x, y):
   if x+y < y+x:
      return 1
   elif x+y > y+x:
      return -1
   else:
      return 0
   
def number_join(li):
   li = list(map(str, li))
   print(li)
   li.sort(key=cmp_to_key(xy_cmp))
   return "".join(li)

print(number_join(li)
P8588 活动选择问题06:33
P8689 活动选择问题实现05:23
P8790 贪心算法总结03:22
P8891 动态规划介绍13:56
P8992 钢条切割问题24:39
P9093 问题:自顶向下实现15:18
P9194 问题:自底向上实现09:48
P9295 钢条切割问题:重构解21:08
P9396 最长公共子序列22:25
P9497 最长公共子序列:实现29:03
P9598 欧几里得算法19:02
P9699 RSA算法介绍07:23
P97100 RSA算法测试09:51
P98101 算法课程总结05:29
P991 设计模式与面向对象介绍26:55
P1002 面向对象设计原则21:42
P1013 简单工厂模式12:39
P1024 工厂方法模式08:39
P1035 抽象工厂模式13:22
P1046 建造者模式15:40
P1057 单例模式12:05
P1068 适配器模式11:54
P1079 桥模式18:50
P10810 组合模式17:23


修改内容