算法
DreamingBetter
这个作者很懒,什么都没留下…
展开
-
算法之归并排序(python)
原理代码实现def merge(li, low, mid, high): # 将两边的有序列表合并成一个有序列表 i = low j = mid+1 ltmp = [] while i<=mid and j<=high: if li[i] < li[j]: ltmp.append(li[i]) i += 1 else: ltmp.a原创 2021-12-23 14:41:42 · 835 阅读 · 0 评论 -
算法之堆排序——topk问题
例如:找前五大的数,先取出列表前五个数,建成小根堆,堆顶即堆中最小值。0与1比较,比1小,跳过,下一个7比1大,7把1换掉,做一次向下调整…遍历整个列表之后,堆中的数即前五大的数。但其实用内置函数heapq即可实现,直接heapq.nlargest(n,li),将li列表中要的前n大参数传入即可返回前n大数的列表。前n小即heapq.nsmallest(n,li),内置函数与向下调整不明白可见算法之堆排序...原创 2021-12-23 13:42:06 · 674 阅读 · 0 评论 -
算法之堆排序(python)
树基础知识子节点(i)找父节点:(i-1)//2堆排序过程代码实现本文以大根堆(从小到大排序)为例。向下调整的条件:节点的左右子树都是堆,但整体(包括自身)不是堆。建堆过程:先找到最后一个非叶子节点,与其叶子节点,先向下调整形成一个小堆。再往前倒二个非叶子节点,也向下调整形成一个小堆…最后整体满足向下调整条件,进行一次向下调整,建堆完成。堆排序过程:用i指向堆的最后一个叶子节点,与堆顶交换位置。接下来对除了最大值的其他数进行向下调整(因为是与最后一个叶子节点交换,所以不影响堆的结构,依原创 2021-12-21 17:49:23 · 620 阅读 · 0 评论 -
算法之快速排序(python)
原理归位代码实现def partition(li, left, right): # 将第一个数归位,即该数左边均小于它,右边均大于它 tmp = li[left] # 取出该值,当作该位置为空位 while left < right: # 左右交替查找直到重合,重合位置就是归位的位置 while left < right and li[right] >= tmp: # 从右往左查找直到出现小于该数的值 right原创 2021-12-21 12:25:46 · 381 阅读 · 0 评论 -
算法之插入排序(python)
原理代码实现def insert_sort(li): for i in range(1,len(li)): tmp = li[i] # 记录当前要插入(摸到)的牌 j = i-1 while j>=0 and li[j]>tmp: # 如果j<0 或者 li[j]的值小于摸到的牌就退出循环 li[j+1] = li[j] # li[j]>摸到的牌,原创 2021-12-21 09:44:12 · 448 阅读 · 0 评论 -
算法之选择排序(python)
原理初始列表为无序区,每遍历一次列表(第i趟),将最小(大)值找到与无序区第一个值(i)交换位置,该值就进入了有序区。每次遍历列表从无序区开始向后遍历。代码实现def select_sort(li): for i in range(len(li)-1): # 和冒泡一样,最后一个数不用排 min_loc = i # 将每一趟无序区第一个数的索引作为最小值索引 for j in range(i+1,len(li)): # 从无序区原创 2021-12-21 09:01:55 · 217 阅读 · 0 评论 -
算法之冒泡排序(python)
演示从小到大排序中,索引i与i+1比较,若li[i]>li[i+1]则交换位置,即大的数向上冒泡,每循环一趟无序区(白色),最大值在最上面。排完需n-1趟,因为最后一个数不需要排。代码实现def bubble_sort(li): for i in range(len(li)-1): # 排完只需n-1趟 for j in range(len(li)-i-1): # 排了i趟就有i个有序,减去i,只需对无序区排序 if li[原创 2021-12-20 21:37:18 · 195 阅读 · 0 评论 -
算法之汉诺塔递归(python)
递归的特点1.调用自身2.结束条件演示将n个圆盘看作两部分,一部分是A柱最底下要移动到目标C柱的最大的圆盘,另一部分是其他n-1个较小的圆盘。n-1个小圆盘就是比n个圆盘规模更小的问题。代码实现def hanoi(n, a, b, c): # 参数:几个圆盘,柱子 if n>0: # 当较小圆盘为0则停止 hanoi(n-1, a, c, b) # 较小圆盘整体从a经过c移动到b print("从原创 2021-12-20 21:17:31 · 283 阅读 · 0 评论 -
算法之二分查找(python)
演示二分查找的前提是:有序列表代码实现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: ri原创 2021-12-20 20:50:43 · 227 阅读 · 0 评论