![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
数据结构与算法
redrose2100
Python开发工程师/DevOps工程师/测试开发工程师
展开
-
数据结构与算法(Python语言)----冒泡、选择、插入三种排序算法对比
冒泡、选择、插入三种排序算法比较虽然冒泡、选择、插入三种排序算法的时间复杂度是n2,但是他们之间也还是有差距的,下面通过几组数据对比对比代码实现import randomimport timeimport copydef cal_time(func): def wrapper(*args,**kwargs): t1=time.time() result=func(*args,**kwargs) t2=time.time()原创 2022-01-12 10:02:33 · 432 阅读 · 0 评论 -
数据结构与算法(Python语言)----插入排序算法
插入排序算法原理插入排序算法类似于打扑克牌,每次从待排序区域抽出一张牌,然后通过比较插入到已排序区的合适的位置插入排序算法动画演示插入排序算法复杂度通过分析插入排序算法,可以很容易发现插入排序算法的时间复杂度同样是n2插入排序算法代码实现代码如下:def insert_sort(li): for i in range(1,len(li)): for j in range(i,0,-1): if li[j]<li[j-1]:原创 2022-01-11 17:24:55 · 310 阅读 · 0 评论 -
数据结构与算法(Python语言)----选择排序算法
选择排序原理(1)首先经过一轮比较,找到最小的元素,放到第一个(2)然后从其他元素中再找出最小的元素,放到第二个…(n)最后就完成整个列表的排序了选择排序动画演示选择排序复杂度通过分析选择排序的过程,很容易得出选择排序的时间复杂度也是n2选择排序算法的代码实现代码如下:def select_sort(li): for i in range(len(li)-1): index=i for j in range(i+1,len(li)):原创 2022-01-11 17:07:27 · 331 阅读 · 0 评论 -
数据结构与算法(Python语言)----冒泡排序算法
冒泡排序原理对列表中每两个相邻的数,如果前面的比后面的打,则交换两个数一趟排序完成后,则无序区减少一个数,有序区增加一个数经过n-1轮的排序后,则完成整个列表的排序冒泡排序算法的动画演示冒泡排序算法的时间复杂度通过对冒泡排序算法的分析,很明显,冒泡排序算法的时间复杂度为n2冒泡排序代码实现def bubble_sort(li): for i in range(len(li)-1): for j in range(len(li)-i-1):原创 2022-01-11 16:15:54 · 405 阅读 · 0 评论 -
数据结构与算法(Python语言)----常见的排序算法及时间复杂度
十种典型的排序算法冒泡排序选择排序插入排序归并排序快速排序堆排序希尔排序计数排序基数排序桶排序十种典型的排序算法比较原创 2022-01-11 15:22:33 · 305 阅读 · 0 评论 -
数据结构与算法(Python语言)----二分查找
二分查找二分查找,又叫折半查找,通过对待查找的值与有序列表的中间值比较,如此将列表分两份,从而每次查找都能将待查找的元素列表减半二分查找动画演示二分法时间复杂度分析从二分法查找算法的步骤可以看出,每次都会减半,因此时间复杂度为logn二分查找法代码实现def binary_search(li,value): left=0 right=len(li)-1 while left<=right: mid=(left+right)//2 i原创 2022-01-11 15:03:23 · 218 阅读 · 0 评论 -
数据结构与算法(Python语言)----顺序查找和二分查找对比与选择
顺序查找和二分查找的对比顺序查找时间复杂度为n,二分查找时间复杂度为logn二分查找要求列表已经有序,顺序查找则对列表是否有序没有要求顺序查找和二分查找耗时比较import timedef cal_time(func): def wrapper(*args,**kwargs): t1=time.time() result=func(*args,**kwargs) t2=time.time() print(f"{func.原创 2022-01-11 15:01:10 · 880 阅读 · 0 评论 -
数据结构与算法(Python语言)----顺序查找
顺序查找顺序查找,也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止顺序查找代码def linear_search(li,value): for index,val in enumerate(li): if val==value: return index return Noneif __name__=="__main__": li=[1,2,3,4,5,6,7,8,9,0] inde原创 2022-01-11 13:38:41 · 547 阅读 · 0 评论 -
数据结构与算法(Python语言)----汉诺塔问题
汉诺塔问题简介汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?汉诺塔问题移动思路汉诺塔问题是典型的递归问题(1) 首先将n-1个圆盘从A,经过C,移动到B(2) 然后将第n个圆盘从A移动到C(原创 2022-01-11 11:18:37 · 615 阅读 · 0 评论 -
leetcode(Java版)-第5题- 最长回文子串
题目给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:“aba” 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"示例 4:输入:s = "ac"输出:"a"使用中心扩展法,需要注意考虑中间两个相同的情况,java代码实现如下:class Solution { public int getLengthOfPalidrome(String原创 2021-07-20 21:38:57 · 178 阅读 · 0 评论 -
leetcode(Java版)-第4题-寻找两个正序数组的中位数
题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5示例 3:输入:nums1 = [0,0], n原创 2021-07-20 17:52:30 · 209 阅读 · 0 评论 -
leetcode(Java版)-第3题-无重复字符的最长子串
题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke原创 2021-07-20 13:33:14 · 205 阅读 · 0 评论 -
leetcode(Java版)-第2题-两数相加
题目给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9],原创 2021-07-19 19:11:32 · 295 阅读 · 3 评论 -
leetcode(Java版)-第1题-两数之和
题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], targe原创 2021-07-19 18:29:07 · 172 阅读 · 0 评论 -
排序算法Java版-快速排序算法
快速排序原理就是荷兰国旗问题原理,java实现如下,注意每次选定中间值需要使用随机来取,如果选取开头或者结尾的数容易遇到最坏的情况,最坏的情况的复杂度为O(n2),当使用随机方式取的时候,复杂度为O(nlogn)package sort;import java.util.Arrays;public class QuichSort { public static void quichSort(int[] arr,int left,int right) { if(a.原创 2021-07-17 21:07:09 · 116 阅读 · 0 评论 -
数据结构与算法Java版-数组分割
问题描述给定一个数组arr和一个数字num,将数组中小于等于nun的数都放到数组的左边,将大于num的数都放到右边java代码实现如下:package problem;public class ArrayPartition { public static void swap(int[] arr,int i,int j) { int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } p原创 2021-07-17 18:56:41 · 622 阅读 · 0 评论 -
数据结构与算法Java版-荷兰国旗问题
荷兰国旗问题荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况:需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。荷兰国旗问题抽象为如下描述:给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边,要求额外空间复杂度为O(1),时间复原创 2021-07-17 18:44:41 · 638 阅读 · 1 评论 -
数据结构与算法Java版-逆序对问题
逆序对问题在一个数组中,左边的数如果比右边的数大,则这两个构成一个逆序对,请打印所有的逆序对原创 2021-07-17 15:33:37 · 333 阅读 · 0 评论 -
数据结构与算法Java版-小和问题
问题:小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和,求一个数组的小和举例如 [1,3,4,2,5]1的左边比1小的数没有,3的左边比3小的数1,4的左边比4小的数:1,32的左边比2小的数:15的左边比5小的数:1,3,4,2所以小和为:1+1+3+1+1+3+4+2=16...原创 2021-07-17 15:31:28 · 186 阅读 · 0 评论 -
排序算法Java版-归并排序算法
归并排序算法如下,使用100万个随机长度的随机数组测试OKpackage sort;import java.util.Arrays;public class MergeSort { public static void merge(int[] arr,int left,int mid,int right) { int[] arr_new=new int[right-left+1]; int i=0; int p1=left;原创 2021-07-17 15:10:28 · 192 阅读 · 0 评论 -
数据结构与算法Java版-使用递归查找数组的最大值
使用递归查找最大值,不断的找中间值,这里需要注意一下,中间值mid尽量不要用(left+right)/2,因为如果数组长度比较大时,进行left+right的时候可能存在溢出,若出现溢出则此时方法就失效了package problem;public class GetMax { public static int getMax(int[] arr,int left,int right) { if(left==right) { re原创 2021-07-17 14:34:56 · 316 阅读 · 0 评论 -
数据结构与算法Java版-二分查找法
二分查找法前提是数组已经有序,如果无序则不能使用二分查找java实现如下:package problem.search;public class BinarySearch { public static int binarySearch(int[] arr,int val) { int left=0; int right=arr.length-1; int mid=0; while(left<=right)原创 2021-07-17 12:19:49 · 173 阅读 · 1 评论 -
排序算法Java版-插入排序算法
插入排序算法java实现package sort;public class InsertSort { public static void swap(int[] arr,int i,int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[i]^arr[j]; arr[i]=arr[i]^arr[j]; } public static void printArray(int[] arr)原创 2021-07-17 11:45:15 · 185 阅读 · 0 评论 -
数据结构与算法Java版-只有两个数出现奇数次
问题:一个数组中,只有两个数字是出现奇数次,其他数字均出现偶数次,请找出出现奇数次的两个数字这儿需要用到一个位运算的技巧,即找到一个数的二进制最右边为1的数,比如temp,即用此数取反加1再和原数按位与,即可找到最右边位为1,其他位为0的数字temp & (~temp +1)思路:1、假设数组元素为[a,b,others],这里others表示一系列数,都是出现偶数次的,a和b出现奇数次,即要找的目标2、首先将数组中所有元素按位异或,得到的结果为 a^b,比如为 0010 00103原创 2021-07-17 11:19:32 · 269 阅读 · 0 评论 -
数据结构与算法Java版-只有一个数出现奇数次
问题:一个数组中,只有一个数字是出现奇数次,其他数字均出现偶数次,请找出出现奇数次的数字典型的位运算的应用,如下:package problem.bitwise;public class OneNumAppearOddTimes { /* 题目:在一个数组中,只有一个数字出现了奇数次,其他的数字均出现偶数次,请找出此数字 */ public static int findNum(int[] arr) { int rs=0;原创 2021-07-17 10:23:08 · 394 阅读 · 0 评论 -
排序算法Java版-选择排序算法
选择排序算法package sort;public class SelectSort { public static void swap(int[] arr,int i,int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[i]^arr[j]; arr[i]=arr[i]^arr[j]; } public static void printArray(int[] arr) {原创 2021-07-17 10:17:27 · 152 阅读 · 0 评论 -
排序算法Java版-冒泡排序算法
冒泡排序算法Java语言实现package sort;public class BubbleSort { public static void swap(int[] arr,int i,int j) { arr[i]=arr[i]^arr[j]; arr[j]=arr[i]^arr[j]; arr[i]=arr[i]^arr[j]; } public static void printArray(int[] arr)原创 2021-07-17 09:27:40 · 139 阅读 · 0 评论 -
数据结构与算法python版(5)-钢条切割问题
1、钢条切割问题:某公司出售钢条,出售价格与钢条长度的关系如下表:问题:现有一段长度为n的钢条,请根据上面的介个表,求切割钢条方案,使得总收益最大2、分析思路:首先可以根据价格表计算出每个长度对应的最高收入,如下钢条切割问题的递推式:钢条切割问题的最优子结构可以将求解规模为n的原问题,划分为规模更小的子问题,完成一次切割后,可以将产生的两端钢条看成两个独立的钢条切割问题组合两个子问题的最优解,并在所有可能的两段切割方案中选择组合收益最大的,构成原问题的最优解钢条切割原创 2021-06-30 02:26:57 · 1230 阅读 · 2 评论 -
数据结构与算法python版(4)-动态规划简介
斐波那契数列:Fn=Fn-1+Fn-2使用递归的算法,代码如下:def fibnacci(n): if n==1 or n==2: return 1 else: return fibnacci(n-1)+fibnacci(n-2)if __name__=="__main__": print(fibnacci(10))执行结果如下:55使用非递归算法实现,代码如下:def fibnacci_no_recurision(n):.原创 2021-06-30 00:35:35 · 192 阅读 · 0 评论 -
数据结构与算法python版(3)-列表顺序查找和二分查找(折半查找)
查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程列表查找:从列表中查找指定的元素输入:列表中的待查找的元素输出:找到的元素的下标,如果未找到,一般返回None或者-1python中查找的内置方法:index()顺序查找代码实现如下:def linear_search(data,elem): for index,val in enumerate(data): if elem == val: return ..原创 2021-06-29 18:56:56 · 416 阅读 · 0 评论 -
数据结构与算法python版(2)-递归与汉诺塔问题
递归简介递归的两个特点:调用自身和结束条件如:def func(x): if x>0: print(x) func(x-1)func(3)执行结果如下:321这里需要注意一下,如将打印语句放到下面,如下代码,结果将是完全不一样的def func(x): if x>0: func(x-1) print(x)func(3)执行结果如下:1232、汉诺塔问题汉诺塔问题:原创 2021-06-29 18:23:21 · 239 阅读 · 2 评论 -
数据结构与算法python版(1)-算法简介
1、时间复杂度时间复杂度:用来评估算法运行效率的一个式子常见的时间复杂度排序O(1)<O(logn)<O(n)<O(nlogn)<O(n2) <O(n2logn)<O(n3)2、判断时间复杂度方法确定问题规模:n循环减半:lognk层关于n的循环:nk复杂情况:根据算法执行过程判断3、时间复杂度举例如下代码,时间复杂度为O(1)print("hello world")如下代码,时间复杂度为O(n)for i in range(n原创 2021-06-29 13:03:30 · 126 阅读 · 0 评论 -
排序算法python版(7)-计数排序算法
计数排序算法动态图计数排序算法的原理计数排序算法原理其实挺简单的,就是首先找出一串数的最小值和最大值,然后将在这个区间的所有整数均统计在给定的数列中出现了次数,然后从最小值开始到最大值,按照出现次数重新存放,即完成排序代码如下:def count_sort(data): min_v=data[0] max_v=data[0] for elem in data: if elem<min_v: min_v=elem .原创 2021-06-24 23:06:54 · 186 阅读 · 0 评论 -
排序算法python版(6)-快速排序算法
快速排序算法动态图如下:快速排序算法思路快速排序算法使用的也是分治的思想,即1、先取出一个基数(一般取第一个),然后遍历将比这个数小的都移动到左侧,大的都移动到右侧2、对1中取到的左侧和右侧分别按照步骤1递归去处理具体代码如下:def quick_sort(datas): if len(datas)<=1: return datas base=datas[0] left=[] mid=[] right=[] for el.原创 2021-06-24 18:44:07 · 186 阅读 · 0 评论 -
排序算法python版(5)-归并排序算法
归并排序动态图如下:归并排序的思路就是分治的思想,具体思路如下:1、将一串数分为两部分,对两部分分别排序,然后将两部分已经有序的数再合到一起2、对1中分成的每一部分,递归的进行上述1的操作具体代码实现如下:def merge_sort(datas): if len(datas)<=1: return datas mid=len(datas)//2 left=merge_sort(datas[:mid]) right=merge_sort(.原创 2021-06-24 05:43:56 · 211 阅读 · 0 评论 -
排序算法python版(4)-希尔排序算法
希尔排序算法动态图如下:希尔排序算法思路希尔排序算法本质上是对插入排序算法的改进,它是发现了当一串数基本有序的情况下,插入算法效率非常高,所以,希尔排序就根据这个特点,通过分段分批处理,让一串数慢慢的变的基本有序,直至最终有序具体代码实现如下:def shell_sort(datas): count=0 gap=len(datas)//2 while gap>0: index=0 for i in range(gap,len(da.原创 2021-06-24 05:19:23 · 246 阅读 · 1 评论 -
数据结构与算法版系列篇
排序算法(1)-冒泡排序算法排序算法(2)-选择排序算法排序算法(3)-插入排序算法原创 2021-06-24 05:04:22 · 197 阅读 · 0 评论 -
排序算法python版(3)-插入排序算法
插入排序算法动态图如下:插入算法思路插入算法和玩扑克牌时排序的方式很像,具体思路如下:1、首先将第一个数作为已经有序的,取第二个数,然后观察如果第一个数比第二个数小,则此时第二个数不栋,若第二个数比第一个数小,则将第一个数移至第二的位置,将原第二个数移至第一个位置2、此时第一第二数已经有序,取第三个数,然后依次将第三个数与第二个第一个数比较,插入到合适的位置3、此时前三个数已经有序,取第四个数,然后依次将第四个数与前三个数比较,插入合适的位置…循环完成后,所有的数有序代码如下:最坏的情.原创 2021-06-24 05:00:17 · 296 阅读 · 1 评论 -
排序算法python版(2)-选择排序算法
选择排序法动态图如下:选择排序算法的思路:选择排序算法的思路就是:1、从第一个数开始遍历找到最小的数,然后将最小的数与第一个数交换2、从第二个数开始遍历找到最小的数,将此时最小的数与第二个数交换3、从第三个数开始遍历找到最下的数,将此事最小的数与第三个数交换…循环n次之后,即完成了从小到大的排序代码如下:最坏的情况下def select_sort(datas): for i in range(len(datas)): min_index=i f.原创 2021-06-24 04:16:08 · 259 阅读 · 2 评论 -
排序算法python版(1)-冒泡排序算法
冒泡算法动态图:代码如下:def bubble_sort(datas): for i in range(len(datas)-1): for j in range(len(datas)-i-1): if datas[j]>datas[j+1]: datas[j],datas[j+1]=datas[j+1],datas[j] print(f"第 {i+1} 轮排序结果:",datas) re.原创 2021-06-23 13:27:48 · 233 阅读 · 1 评论