一.数据结构与算法概述

数据结构与算法的定义

我们把现实中大量而且非常复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到相应的主存储器(内存)中,以及在此基础上为实现某个功能而执行的相应操作,这个相应操作也叫做算法.

数据结构 = 个体 + 个体的关系

算法 = 对存储数据的操作

二.衡量算法的标准

时间复杂度 指的是大概程序执行的次数,并非程序执行的时间

空间复杂度 指的是程序执行过程中,大概所占有的最大内存

常用的查找

顺序查找

lowB for循环

时间复杂度 O(n)

def linerSearch(li,val):
for i in range(len(li)):
if li[i] == val:
return i

顺序查找

二分查找

二分查询的列表必须有序!

时间复杂度 O(logn)

# 递归
def binarySearch(li,low,high,val):
if low < high:
mid = (low+high) // 2
if li[mid]==val:
return mid
elif li[mid]<val:
binarySearch(li,mid+1,high,val)
elif li[mid]>val:
binarySearch(li,low,mid-1,val)
else:
return -1 # 循环
def binary_search(li,value):
low = 0
high = len(li)
while low <= high:
mid = (low+high)//2
if li[mid] == value:
return mid
elif li[mid] > value:
high = mid -1
else:
low = mid +1

二分查找

常用的几个排序

冒泡排序

时间复杂度:O(n2)

def BubbleSort(li):
for i in range(len(li)):
flag = False
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
flag = True
if not flag:
return li

冒泡排序

选择排序

时间复杂度:O(n2)

 

def selectSort(li):
for i in range(len(li)):
for j in range(i+1,len(li)):
if li[i] > li[j]:
li[i],li[j] = li[j],li[i]
print(li)

选择排序

插入排序

时间复杂度:O(n2)

 

def insertSort(li):
for i in range(1,len(li)):
tmp = li[i]
j = i - 1
while j>=0 and li[j]>tmp:
li[j+1] = li[j]
j-=1
li[j+1]=tmp
print(li)

插入排序

快速排序

时间复杂度:O(nlogn)

 

# 一次调整
def partition(li,left,right):
tmp = li[left]
while left <right:
while left < right and li[right]>=tmp:
right=right - 1
li[left] = li[right]
while left < right and li[left] <= tmp:
left+=1
li[right] = li[left]
li[left] = tmp
return left # 快速排序
def quickSort(li,left,right):
if left < right:
mid = partition(li, left, right) ### O(n)
quickSort(li, left, mid - 1) ### O(logn)
quickSort(li, mid + 1, right)

快速排序

归并排序

时间复杂度:O(nlogn)

 

# 一次归并
def merge(li,low,mid,right):
i = low
j = mid +1
ltmp = []
while i <= mid and j <=right:
if li[i] <li[j]:
ltmp.append(li[i])
i = i + 1
else:
ltmp.append(li[j])
j = j + 1
while i <= mid:
ltmp.append(li[i])
i = i + 1
while j <= right:
ltmp.append(li[j])
j = j + 1
li[low:right + 1] =ltmp def mergeSort(li, low, high):
if low < high:
mid = (low + high) // 2
mergeSort(li, low, mid)
mergeSort(li, mid + 1, high)
print('归并之前:', li[low:high+1])
merge(li, low, mid, high)
print('归并之后:', li[low:high + 1])

归并排序

希尔排序

时间复杂度:O(nlogn)

 

def shell_sort(li):
gap = len(li)//2
while gap > 0 :
for i in range(gap,len(li)):
tmp = li[i]
j = i -gap
while j>=0 and tmp <li[j]:
li[j + gap ] = li[j]
j -= gap
li[j + gap] = tmp
gap //= 2

希尔排序

计数排序

时间复杂度:O(nlogn)

def countSort(li):
li_new=[]
count = [0 for i in range(len(li))]
for i in li:
count[i]+=1 for index,val in enumerate(count):
print(index,val)
for i in range(val):
li_new.append(index)
print(li_new)

计数排序

排序小结

排序方法

时间复杂度

稳定性

代码复杂度

最坏情况

平均情况

最好情况

冒泡排序

O(n2)

O(n2)

O(n)

稳定

简单

直接选择排序

O(n2)

O(n2)

O(n2)

不稳定

简单

直接插入排序

O(n2)

O(n2)

O(n2)

稳定

简单

快速排序

O(n2)

O(nlogn)

O(nlogn)

不稳定

较复杂

堆排序

O(nlogn)

O(nlogn)

O(nlogn)

不稳定

复杂

归并排序

O(nlogn)

O(nlogn)

O(nlogn)

稳定

较复杂

希尔排序

 

O(1.3n)

 

不稳定

较复杂

三.数组与链表

数据结构与算法(Python)的更多相关文章

  1. 数据结构与算法-Python/C(目录)

    第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场 ...

  2. 北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  3. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  4. 学习笔记:[算法分析]数据结构与算法Python版[基本的数据结构-上]

    线性结构Linear Structure ❖线性结构是一种有序数据项的集合,其中 每个数据项都有唯一的前驱和后继 除了第一个没有前驱,最后一个没有后继 新的数据项加入到数据集中时,只会加入到原有 某个 ...

  5. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  6. 数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现

    Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列 ...

  7. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  8. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  9. 【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现

    无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将 ...

随机推荐

  1. SQLite 实现删除表中前一天的数据

    注意点1 要注意SQLite datatime()函数为何获取不到系统本地时间?这个问题,坑死我了. 解决方法详见这篇文章:SQLite datatime()函数为何获取不到系统本地时间? 注意点2: ...

  2. Angular刷新浏览器 404 问题

    最近在用angular写一个后台的项目,遇到一个小问题. 进入某个路由页面之后,手动触发浏览器的刷新,然后就404了... 翻看Angular的文档,发现Google早已经给我们想到了这个问题的处理方 ...

  3. 朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则

    朱晔的互联网架构实践心得S1E6:给飞机换引擎和安全意识十原则 [下载本文PDF进行阅读] 本文有两个部分,先介绍一下给飞机换引擎这个事情我的一些经验,因为篇幅较短然后介绍一下安全意识方面的一些心得. ...

  4. JAVA 最新 环境搭建(JDK 1.8 + Tomcat 9 + eclipse oxygen + mysql 5.7)

    一.JDK的安装与配置 1.从官网下载jdk,注意是jdk不是jre.jdk包里面包含了jre.最好从官网下载.传送门:http://www.oracle.com/technetwork/java/j ...

  5. vue 生产环境 background 背景图不显示原因

    通常我们使用img标签引入文件,npm run build 打包后 ,因为img为html标签,打包后他的路径是由index.html开始访问的,他走static/img/'图片名'是能正确访问到图片 ...

  6. 如何在Github中删除已有仓库或文件

    一.删除已有仓库如果我们想要删除Github中没有用的仓库,应该如何去做呢? 进入到我们需要删除的仓库里面,找到“settings”即仓库设置: 然后,在仓库设置里拉到最底部,找到“Danger Zo ...

  7. Python-os模块-60

    os 模块: 和操作系统打交道的模块 os模块是与操作系统交互的一个接口 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirna ...

  8. Python常用内建方法:__init__,__new__,__class__的理解

    python中所有类都是继承自object, 而object提供了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性.可以使用dir()函数可以查看,虽然python提供 ...

  9. 1060D Social Circles(贪心)

    题意:有n个客人,第i个客人希望左边至少Li个空椅子,右边至少Ri个空椅子,每个客人都属于一个圈,问你最少需要准备的椅子数量 贪心做,每个人都可以去和另一个人牵手,组成一个新的人,那么我们让大的和大的 ...

  10. Ordering Tasks

    链接 [https://vjudge.net/contest/281085#problem/D] 题意 有n个任务,有M个对先后顺序 然你输出最后的完成任务的顺序,有多种可能输出一种即可 分析 裸的拓 ...