![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构(python)
基于python语言实现数据结构与算法
线程撕裂者+
莫愁前路无知己,天下谁人不识君
展开
-
贪心算法-活动选择问题(python实现)
贪心算法-活动选择问题假设有n个活动,这些活动要占⽤同⼀⽚场地,⽽场地在某时刻只能供⼀个活动使⽤。每个活动都有⼀个开始时间si和结束时间fi(题⽬中时间以整数表示),表示活动在[si, fi)区间占⽤场地。问:安排哪些活动能够使该场地举办的活动的个数最多?activities = [(1,4), (3,5), (0,6), (5,7), (3,9), (5,9), (6,10), (8,11), (8,12), (2,14), (12,16)]# 保证活动是按照结束时间排好序的acti原创 2021-05-07 02:00:03 · 3667 阅读 · 3 评论 -
贪心算法-拼接最大数字问题(python实现)
贪心算法-拼接最大数字问题有n个⾮负整数,将其按照字符串拼接的⽅式拼接为⼀个整数。如何拼接可以使得得到的整数最⼤?例:32,94,128,1286,6,71可以拼接除的最⼤整数为94716321286128from functools import cmp_to_keyli = [32, 94, 128, 1286, 6, 71]def xy_cmp(x, y): if x+y < y+x: return 1 elif x+y > y+x:原创 2021-05-07 01:55:57 · 1741 阅读 · 1 评论 -
贪心算法-背包问题(python实现)
贪心算法-背包问题⼀个⼩偷在某个商店发现有n个商品,第i个商品价值vi元,重wi千克。他希望拿⾛的价值尽量⾼,但他的背包最多只能容纳W千克的东⻄。他应该拿⾛哪些商品?0-1背包:对于⼀个商品,⼩偷要么把它完整拿⾛,要么留下。不能只拿⾛⼀部分,或把⼀个商品拿⾛多次。(商品为⾦条)分数背包:对于⼀个商品,⼩偷可以拿⾛其中任意⼀部分。(商品为⾦砂)举例:商品1:v1=60 w1=10商品2:v2=100 w2=20商品3:v3=120 w3=30背包容量:W=50 goods = [(6原创 2021-05-07 01:52:56 · 3402 阅读 · 0 评论 -
贪心算法-找零问题(python实现)
贪心算法贪⼼算法(⼜称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪⼼算法并不保证会得到最优解,但是在某些问题上贪⼼算法的解就是最优解。要会判断⼀个问题能否⽤贪⼼算法来计算。找零问题找零问题假设商店⽼板需要找零n元钱,钱币的⾯额有:100元、50元、20元、5元、1元,如何找零使得所需钱币的数量最少?from functools import cmp_to_keyli = [32, 94, 12原创 2021-05-07 01:49:05 · 1369 阅读 · 0 评论 -
基数排序(python语言实现)
基数排序基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法def radix_sort(li): max_num = max(li) # 最大值 9->1原创 2021-05-07 01:44:05 · 148 阅读 · 0 评论 -
桶排序(python语言实现)
桶排序桶排序(Bucket Sort):将元素分在不同的桶中,在对每个桶中的元素排序。桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。def bucket_sort(li, n=100,原创 2021-05-07 01:39:47 · 468 阅读 · 0 评论 -
计数排序(python语言实现)
计数排序排序过程编辑假设输入的线性表L的长度为n,L=L1,L2,…,Ln;线性表的元素属于有限偏序集S,|S|=k且k=O(n),S={S1,S2,…Sk};则计数排序可以描述如下:1、扫描整个集合S,对每一个Si∈S,找到在线性表L中小于等于Si的元素的个数T(Si);2、扫描整个线性表L,对L中的每一个元素Li,将Li放在输出线性表的第T(Li)个位置上,并将T(Li)减1def count_sort(li, max_count=100): count = [0 for _ in原创 2021-05-07 01:34:41 · 90 阅读 · 0 评论 -
希尔排序(python语言实现)
希尔排序(python语言实现)一、希尔排序(分组插⼊排序算法)二、实现步骤1.⾸先取⼀个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进⾏直接插⼊排序;2.取第⼆个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同⼀组内进⾏直接插⼊排序。 希尔排序每趟并不使某些元素有序,⽽是使整体数据越来越接近有序;3.最后⼀趟排序使得所有数据有序。代码实现:def insert_sort_gap(li, gap):#所需插入排序部分 for i原创 2021-04-15 01:23:20 · 236 阅读 · 0 评论 -
归并排序(基于python语言实现)
归并排序(基于python语言实现)思路:1.分解:将列表越分越⼩,直⾄分成⼀个元素。2.终⽌条件:⼀个元素是有序的。3.合并:将两个有序列表归并,列表越来越⼤。下图这种操作称为⼀次归并代码实现def merge(li, low, mid, high): i = low j = mid + 1 ltmp = [] while i<=mid and j<=high: # 只要左右两边都有数 if li[i] < li[j]:原创 2021-04-15 01:14:31 · 181 阅读 · 0 评论 -
堆排序 - topk问题(python语言实现)
堆排序 - topk问题(python语言实现)现在有n个数,设计算法得到前k⼤的数。(k<n)解决思路:1.取列表前k个元素建⽴⼀个⼩根堆。堆顶就是⽬前第k⼤的数。2. 依次向后遍历原列表,对于列表中的元素,如果⼩于堆顶,则忽略该元素;如果⼤于堆顶,则将堆顶更换为该元素,并且对堆进⾏⼀次调整;3.遍历列表所有元素后,倒序弹出堆顶。代码实现:#创建一个比较排序函数,供下面函数调用def sift(li, low, high): i = low j = 2 * i +原创 2021-04-06 21:34:16 · 554 阅读 · 0 评论 -
python算法 - 堆排序(完全二叉树)
堆排序(python语言实现):堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆:⼀种特殊的完全⼆叉树结构⼤根堆:⼀棵完全⼆叉树,满⾜任⼀节点都⽐其孩⼦节点⼤⼩根堆:⼀棵完全⼆叉树,满⾜任⼀节点都⽐其孩⼦节点⼩堆排序过程1.建⽴堆。2.得到堆顶元素,为最⼤元素3.去掉堆顶,将堆最后⼀个元素放到堆顶,此时可通过⼀次调整重新使堆有序。4.堆顶元素为第⼆⼤元素。5.重复步骤3,直到原创 2021-04-06 21:23:20 · 275 阅读 · 0 评论 -
快速排序(Python语言实现)
快速排序(基于Python实现)快速排序(Quicksort):是对冒泡排序算法的一种改进,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列快速排序算法排序流程:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于原创 2021-04-06 21:07:54 · 122 阅读 · 0 评论 -
python排序算法-插入排序
python排序算法-插入排序一、插入排序可将插入排序看做摸牌过程,有序区记为手里的牌,无序区记为被摸牌1.初始时手里(有序区)只有一张牌2.每次(从无序区)摸一张牌,插入到自己手里已有牌的正确位置二、代码def insert_sort(li): for i in range(1, len(li)): tmp = li[i] # 被摸的牌 j = i - 1 # 开始时为手里最后一张牌的下标 while j > 0 and j原创 2021-03-29 02:47:05 · 223 阅读 · 0 评论 -
python排序算法-选择排序
python排序算法-选择排序一、选择排序1.一趟排序纪录最小的数,放在第一个位置2.再一次排序记录列表无序区最小的数,放在第二个位置关键有序区、无序区、无序区最小数的位置代码def select_sort(li): for i in range(len(li) - 1): # i是第几趟 min_s = i # 最小值的位置记为i for j in range(i + 1, len(li)): # j是从哪看到哪 if l原创 2021-03-29 02:39:39 · 151 阅读 · 0 评论 -
python排序算法 - 冒泡排序(两种冒泡方式比较)
python排序算法 - 冒泡排序排序(将无序列表变为有序列表)输入:列表 输出:有序列表虽然python内置排序函数sort(),但我们也要懂排序算法一、冒泡排序1.列表每两个相邻的数,如果前面的数比后面的数大,则交换两个数2.一趟排序完成后,无序区减少一个数,有序区增加一个数...原创 2021-03-27 23:11:40 · 415 阅读 · 2 评论 -
python查找算法 - 二分查找
python算法 - 二分查找1、二分法二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使原创 2021-03-27 20:48:34 · 184 阅读 · 1 评论 -
python递归算法 - 汉诺塔问题
python算法之用递归解决汉诺塔问题经典汉诺塔问题:有三根柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。问:移动完这些圆盘,需要移动多少次,设计程序记录移动的步骤图例3.8:以三个圆盘为例,实现递归算法实现步骤:(最下面的一个盘子记为N,上面的所有盘子记为N-1,看做一个整体)N个盘子时1.把N-1个盘子从A经过C移动到Bhannoi(N-1,A,C,B原创 2021-03-26 00:39:05 · 3035 阅读 · 2 评论