python算法
发条宇
在哪跌倒,在哪站起来
展开
-
二分法查找python
二分法查找也就是通常所说的折半查找,但是有一个要求:数组是必须是有序的。思路分析:范围每次缩小一半,直到只剩一个元素。代码思路:不断的除以2,假定我们要查找的元素是 who, 中点 middlePoint# -*- coding: utf-8 -*-def binarySearch(arr, who): # 记录数组的最高位和最低位 min = 0 max = len(arr) - 1 if who in arr: # 建立一个死循环,直到找到wh原创 2021-08-30 21:36:49 · 106 阅读 · 0 评论 -
二叉树的广度优先遍历python
广度优先遍历从根节点开始遍历,优先遍历其子节点,再从左至右的,依次遍历其孙子节点的,以此类推,直到完成整颗二叉树的遍历。以如上的二叉树为例,其广度优先遍历的顺序是:50、20、60、15、30、70。借助使用队列进行广度优先遍历,先把根节点放入队列,利用队列的先进先出原则,访问队列中取出的节点,并分别把左子节点和右子节点放入队列,循环下去,直到队列为空。代码示例如下:# encoding=utf-8from queue import Queueclass TreeNode(object):原创 2021-08-30 17:07:03 · 702 阅读 · 0 评论 -
二叉树的深度优先遍历python
二叉树应用场景很多,比如:数据检索,数据管理二叉树的遍历,分为深度优先遍历,以及广度优先遍历。在深度优先遍历中,具体分为如下三种:先序遍历:先访问根节点,再遍历左子树,再遍历右子树;中序遍历:先遍历左子树,再访问根节点,再遍历右子树;后序遍历:先遍历左子树,再遍历右子树,再访问根节点对于上图的二叉树,其先序遍历结果是:50,20,15,30,60,70;其中序遍历结果是:15,20,30,50,60,70;其后序遍历结果是:15,30,20,70,60,50# encoding=utf-8原创 2021-08-30 16:49:14 · 491 阅读 · 0 评论 -
栈python
栈作为一种数据结构,是一种只能在一端进行插入和删除操作。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)定义一个实例属性 top三个实例属性:栈顶元素peek()出桟pop()入栈push()# encoding=utf-8class Node(object): def __init__(self,val): self.val = val self.next =原创 2021-08-30 16:40:35 · 79 阅读 · 0 评论 -
队列python
首先复习一下队列队列的特点: 先进先出就像我们去排队一样,站在前面的先到窗口办事,站在后面的后到窗口办事。应用场景:消息通信、多进程间的协同、多线程间的协同在队列中,我们需要设计的实例属性有两个:head节点、tail节点。需要设计的实例方法有两个,分别是入队列enqueue和出队列dequeue。既然有先后,有节点。先不妨写个节点信息:class Node(Object): def __init__(self,value): self.value = value原创 2021-08-30 16:15:50 · 116 阅读 · 0 评论 -
链表python
链表的增加,删除,插入,查找及打印。#encoding=utf-8class Node: def __init__(self,value=None,next=None): self.value = value self.next = nextclass LinkedList(object): def __init__(self,head=None): self.head = head def __len__(self):原创 2021-08-30 15:46:20 · 77 阅读 · 0 评论 -
堆排序python
堆是一颗特殊的二叉树,一般分为最小值堆和最大值堆,最小值堆满足如下的特点:二叉树中的任一节点的关键码值都小于或者等于它的两个子女节点的关键码值。最大值堆则反之。堆的典型应用场景有:堆排序:每次把堆的顶点元素放在二叉树的尾部,之后重新建堆。在求最优解的算法中应用。例如求最短路径的Dijkstra算法中,使用堆进行优化等。# encoding=utf-8#左叶子、右叶子和父节点,三个元素,找到最大的一个def maxHeap(heap,heapSize,i): #i为某个节点原创 2021-08-26 16:02:56 · 98 阅读 · 0 评论 -
基数排序python
基数排序(radix sort)是一种只适用于数字或字母类型的排序方法,它检查数字或字母的每一位,将之分类,按照位数的特定顺序,来将元素排列。以数字为例,将所有元素按照个位数字分类,分类好后,将个位数字大小排列组合起来,再按照十位数字分类,再按照数字大小排列组合起来,一直到最大数位为止。def radix_sort(array): bucket, digit = [[]], 0 while len(bucket[0]) != len(array): print ("buc原创 2021-08-26 15:50:30 · 217 阅读 · 0 评论 -
归并排序python
归并排序使用了二分法,拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。def merge(a, b): c = [] h = j = 0 while j < len(a) and h < len(b): if a[j] < b[h]: c.append(a[j]) j += 1 else: c.app原创 2021-08-26 15:47:06 · 70 阅读 · 0 评论 -
希尔排序python
希尔排序也是一种插入排序,是简单插入排序经过改进之后一种更为高效的排序方法,也称为缩小增量排序。该算法是冲破O(n的平方n^2)的第一批算法之一。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。def shellSort(nums): # 设定步长 step = int(len(nums)/2) while step > 0: for i in原创 2021-08-26 15:37:37 · 100 阅读 · 0 评论 -
快速排序python
快速排序是一个基于递归的排序算法。对于列表选取一个轴值,一般选择第一个元素或者最后一个元素。把列表中小于该轴值的排在左边,大于该轴值的排在右边,这样,轴值在列表中的位置就确定了。由此衍生出了轴值的左子列表,以及右子列表,递归的对于左子列表以及右子列表使用上述的排序算法,直到子列表中只有一个元素。首先复习一下 递归:#encoding = utf -8def factorial(n): if n <= 0: return 1 else: ret原创 2021-08-26 15:09:07 · 70 阅读 · 0 评论 -
插入排序python
插入排序的核心思想:将一个数据插入到已经拍好序的有序数据中,从而得到一个新的,个数加1的有序数。序列的第一个元素是有序的,第二个元素和第一个元素相比,插入到合适的位置,这样前两个元素就有序了,然后,把第三个元素插入到前面包含两个元素的有序列表中,直到插完第n个元素。解释说明:将多个元素进行有序排序时,类似于 冒泡排序,找出最个数,交换位置。# encoding=utf-8def insertSort(listx): xLen = len(listx) for i in range原创 2021-08-26 14:41:12 · 116 阅读 · 0 评论 -
选择排序python
def selectSort(listx): xLen = len(listx) for i in range(xLen-1): min = i#遍历完成之后,min就指向了最小元素的下标 for j in range(i+1, xLen): if listx[min] > listx[j]: min = j#把将最小的元素值和坐标为i的元素值进行交换 temp = listx[原创 2021-08-23 17:00:01 · 83 阅读 · 0 评论 -
冒泡排序python
1、冒泡排序核心算法:在数组x[n]中,从第一个数开始,拿x[i]和后面的数x[i+1]进行比较,如果x[i]比后面的大,就交换两个数的位置,这样遍历一遍数组后,把最大的数排在了最后面,之后继续循环排剩下的n-1个数,直到完成所有的排序,由于每次都是把最大的排到最后面,就好像冒泡一样,故取名冒泡排序。详细讲解:里层for循环的逻辑:第一步:从第一个元素开始,与第二个元素比较,如果小于,则交换两个元素的位置,否则不交换位置。第二步:从第二个元素和第三个元素比较,如果小于,则交换两个元素的位置,否则不原创 2021-08-23 16:29:22 · 101 阅读 · 0 评论