数据结构与算法
一匹脱缰的野马
一匹脱缰的野马
展开
-
冒泡排序算法/排序算法总结
冒泡排序冒泡排序思想:逐个对比,逐个交换,然后把一个最大或最小数值放到队列尾部。就像气泡一样让他升起来。第一种方法:list_01=[2,3,1,5]for i in range(len(list_01)-1): for j in range(0,len(list_01)-1-i): if list_01[i]>list_01[j+i+1]:...原创 2019-03-16 15:53:27 · 406 阅读 · 0 评论 -
基本顺序表与元素外围顺序表
对于32位机器来说普通基本整型占4个字节,存储1的时候为31个0加上一个1,来表示整型1。图中灰色部分表示整型1的存储方式,31个0加上一个1。8位为一个字节,存储整型1占用了4个字节,存储的空间连续。char可以理解为字符串中的一个字符,一个char占一个字节(即一个存储单元)计算机拿到数据时如何区别这个数据是整数还是字符?当数据为整形连续存储时如下图:...原创 2019-06-08 10:28:34 · 372 阅读 · 0 评论 -
顺序表的一体式结构与分离式结构
顺序表的结构数据存储时需要预估存储多少数据,数据表分成两部分(表头信息和数据区),表头区记录存储容量和当前存储了多少个元素,数据区记录已经存储了多少个数据。连续式存储如下:4代表可以存储4个元素,3代表已经存储了3个,3下面的4个位置有三个被占用,剩下一个为空。分离式存储如下:分离式的话需要先找到0x111,然后再通过0x119记录的地址找到数据。...原创 2019-06-08 15:50:00 · 1125 阅读 · 0 评论 -
python实现栈和栈的括号匹配
栈(stack)栈(stack)数据结构只允许在一端进行操作,可以在一端(栈顶)进行出栈和入栈,而在另一端(栈底)不能进行操作,并且后进先出。当顺序表和链表只能在一端进行操作(头或尾)时,顺序表和链表会变成栈。栈可以用顺序表实现也可以用链表实现。栈与顺序表的区别:栈数据结构描述的是操作,顺序表和链表描述的是数据如何存放。栈的代码实现使用列表入栈和出栈为什么...原创 2019-06-10 09:45:47 · 999 阅读 · 0 评论 -
python实现队列
队列(queue)队列(queue)是只允许在一端添加,在另一端获取或删除,先进先出。队列与可以用顺序表和链表来实现。代码实现队列使用顺序表来实现队列操作一端进队列,一端出队列class Queue(object): def __init__(self): self.__list = [] def enqueue(self,item):...原创 2019-06-10 10:23:46 · 4338 阅读 · 1 评论 -
为什么python中不需要声明数据类型?
python中是如何交换两个数的值的呢?a,b = b,a 就可以实现a,b值的交换,但是它的内在原理是什么呢?在其它语言中给a赋值过程为:int a=10,这里的a代表的就是一个整型的10。但是在python中不是这样,python中的赋值为a = 10。这里的a代表的不是10,a在这里代表的是一个地址,这个地址指向10。所以在交换的时候把a和b指向的地址改变就可以实现a,b的交换...原创 2019-06-10 17:03:18 · 11738 阅读 · 2 评论 -
单链表图示
顺序表和链表都称为线性表,因为他们都是一维的。为什么使用链表?构建顺序表需要预先知道数据大小来申请连续的存储空间,而在进行扩充时需要数据整体搬迁。使用链表可以充分利用计算机的内存,实现灵活的内存动态管理。链表示意图如下:单链表单链表的示意图和概念如下:单链表的节点存储了元素的数据和下一个节点的地址。创建节点示意图创建节点前需要先创建出一个节点类...原创 2019-06-10 17:30:12 · 3018 阅读 · 0 评论 -
python实现单链表
在制作链表的过程中需要制作节点类和链表类cur先指向_head位置,然后慢慢的向后移动,cur用来计数,计算链表中有多少个节点。头插法建立新节点新节点指向elem为100的节点__head指向elem为400的节点这么做可以避免节点丢失 def add(self,item): """链表头部添加元素""" ...原创 2019-06-11 11:15:11 · 293 阅读 · 0 评论 -
单链表与顺序表比较
顺序表具有随机读取的优点而链表则没有,链表的指针域会占用内存空间,但就存储空间的使用来说链表更加灵活。链表和顺序表的各种操作复杂度如下所示。链表可以把分散的空间利用起来,但是链表会多占内存,多占的内存用来存储下一个节点的地址。在中间插入或删除元素的时候虽然链表和顺序表的操作复杂度都为O(n),但是意义不一样,链表的复杂度体现在遍历数据上,而顺序表则体现在了搬迁数据上。...原创 2019-06-11 15:09:17 · 552 阅读 · 0 评论 -
内存、类型本质和连续存储
顺序表的基本布局为什么列表的第一个下标从0开始?列表的下标表示偏移量,0位置下标表示没有发生偏移,1下标表示偏移了一位Li=[100,390,78,12112]中的Li保存了列表的存储地址,实际上保存的是列表的首地址,这样便于在Li中存储和查找元素外置的顺序表由于每一个元素所占空间大小不同,而元素的地址所占空间大小是一定和连续的(32位4字节),所以用到了元素外置...原创 2019-06-08 09:51:04 · 452 阅读 · 0 评论 -
python实现双向链表
双向链表示意图如下:在头部插入元素如下图所示:让node的next指向值为100的节点,也就是让node.next = self.__head。让头(蓝色区域)指向node节点,也就是self.__head =node让值为100区域的prev指向node节点,也就是node.next.prev = node在尾部插入元素如下图所示:node.nex...原创 2019-06-12 17:23:50 · 487 阅读 · 0 评论 -
选择排序算法/排序算法总结
选择排序插入排序与选择排序,都是把数据分成两部分,一部分是排好序的,另一部分是没有排好序的,然后从没有排好序的位置选择数据,放到排好序的序列的合适位置。选择排序就是让列表中的第一个数值,第二个数值,第三个数值跟他后面的数据进行比较(不跟本数据前面的数据进行比较),后面的数据有小于该数据的数(Data),就让数Data跟第N数进行位置交换。然后再进行比较结果不用再交换位置了...原创 2019-03-16 15:57:35 · 420 阅读 · 0 评论 -
插入排序算法/排序算法总结
插入算法(插入排序)原始序列默认把序列分成两部分【 54("默认这里为有序序列,然后从右边选择最小的数据放到这里"), 26,93,17,77,31,44,55,20】1.第一次选择列表右部分的无序序列的第一个元素26,把26与54进行比较,26比54小所以26和54交换位置。结果为:【26,54, 93,17,77,31,44,55,20】...原创 2019-03-16 16:00:30 · 354 阅读 · 0 评论 -
希尔排序算法/排序算法总结
希尔排序希尔排序是插入排序的一种。也叫做缩小增量排序。是直接插入排序的更高效的改进版。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。思路:不要认为序列是一个有机的整体,而是有很多个无序的序列组成的,希尔排序就是分段分组的插入排序1.取间...原创 2019-03-16 16:02:52 · 1192 阅读 · 0 评论 -
快速排序算法/排序算法总结
快速排序的思路:不像插入排序和选择排序那样把序列看成两个部分,而是看元素最终放到有序序列的哪个位置。如下直接查找54应该在那个位置,54左边都应该比54小,而54右边都因该比54大,所以设置两个游标low和游标high,当两个游标交汇的地方就是54所应该在的位置:过程如下:1.第一趟排序刚开始的时候,如下:low不断往前移动(只要数据小于54就不断往右移,直到...原创 2019-03-17 17:33:29 · 1599 阅读 · 0 评论 -
递归排序算法/排序算法总结
递归排序算法详情接上面快速排序。当上面序列排序完毕之后,序列分成两部分,对左右序列进行相同的排序操作,可以认为就是递归操作。就是对相同的快速排序算法执行多次。对左部分继续调用quick_sort()排序,44会找到他正确的位置。之后44会把他的左右两边分成两部分,44的左边为26,31,17,44的右边为空。对于右边继续排序,会把77安放在他应该在的位置。77的左边...原创 2019-03-17 21:32:13 · 2624 阅读 · 0 评论 -
利用递归的思想实现归并排序算法/排序算法总结
归并排序首先进行的是对序列拆分。首先把序列拆成两部分,然后对拆分完的子序列再次拆分成两部分,然后再次不断拆分,结果如下:(1)然后再对序列进行两两合并排序,结果如下:(2)在26和17下面设置游标,结果如下:对于left游标和right游标所指的数值比较大小,把小的值挑出来,然后值为空的地方进行游标右移,结果如下再次对left和right所指位置的数值进行比...原创 2019-03-23 14:46:45 · 1350 阅读 · 0 评论 -
二分查找的递归与非递归实现方法/查找算法总结
二分查找的前提是序列必须要排序完成,不能拿无序序列来进行二分法查找。二分查找的最优时间复杂度为O(1),最坏时间复杂度为O(log n)二分查找的递归版本def binary_search(alist,item): n=len(alist) if n>0: mid = n // 2 if alist[mid]==item: ...原创 2019-03-23 16:09:52 · 452 阅读 · 0 评论 -
四种洗牌算法
(1).简单来说就是从原始数据中随机剔除一个数据,并将剔除的数据加入到新的列表中官方点的话如下:Fisher–Yates Shuffle 算法思想就是从原始数组中随机抽取一个新的数字到新数组中。算法描述如下:1. 从还没处理的数组(假如还剩k个)中,随机产生一个[0, k]之间的数字p(假设数组从0开 始);2. 从剩下的k个数中把第p个数取出; 3. 重复步骤2和3直到数...原创 2019-03-24 10:09:53 · 564 阅读 · 0 评论 -
python实现单向循环链表
普通单链表和单向循环链表的不同之处在于单向循环链表成环,在这种情况下链表指针移动到尾部的判定条件要发生改变,增删改查也要发生改变,但还是以本博客的"python实现单链表"中的代码为基础来实现的。# 单向循环链表class Node(object): """节点类""" def __init__(self,elem): self.elem = e...原创 2019-06-12 10:51:17 · 535 阅读 · 0 评论