一.数据结构与算法概述

数据结构与算法的定义

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

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

算法 = 对存储数据的操作

二.衡量算法的标准

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

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

常用的查找

顺序查找

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. Omi 拥抱 60FPS 的 Web 动画

    写在前面 Omi 框架 正式发布了 → omi-transform. Made css3 transform super easy. Made 60 FPS easy. 作为 Omi 组件化开发特效运 ...

  2. Windows下如何更新 CodeBlocks 中的 MinGW 使其支持新版本 C++

    转自:http://blog.csdn.net/wtfmonking/article/details/17487705 虽然 CodeBlocks16.01 已经是最新版了,但其中的 MinGW 仍然 ...

  3. C. Nastya Is Transposing Matrices

    链接 [https://codeforces.com/contest/1136/problem/C] 题意 给你两个规模一样的矩阵 问是否可以通过不断选取A矩阵的子"方正"转置得到 ...

  4. 【M2】软件工程终期总结报告——前端设计总结

    PhylabWeb——前端设计感想 简介 本文的内容是关于我参与的软件工程项目——“Phylab-Web物理实验中心网站”的前端设计个人总结,来自团队:软剑攻城队 网站地址为:http://buaap ...

  5. 广州商学院16级软工一班&二班-第二次作业成绩

    作业地址 https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 https://edu.cnblogs.com/campus/gzc ...

  6. 把玩Alpine linux(一):安装

    导读 Alpine Linux是一个面向安全应用的轻量级Linux发行版.它采用了musl libc和busybox以减小系统的体积和运行时资源消耗,同时还提供了自己的包管理工具apk.Alpine ...

  7. 快速为git添加一个用户

    环境:用gitosis-admin管理git的权限. 前期git环境的搭建略去,主要给出快速添加一个用户的步骤: 在git bash中用“ssh-keygen -t rsa”生成公钥私钥,默认放到 “ ...

  8. Tomcat Cluster

    Tomcat群集配置| Tomcat集群| MuleSofthttps://www.mulesoft.com/tcat/tomcat-cluster Tomcat Clustering - A Ste ...

  9. JSP页面导致tomcat内存溢出一例

    今天发现一个奇怪的问题,一个tomcat应用,里面只有一个单纯的jsp页面,而且这个jsp页面没有任何java代码——想用这个jsp页面配合tomcat完成一个性能验证.但是用jmeter压测了几分钟 ...

  10. 微信QQ打开网页时提示用浏览器打开

    微信QQ打开网页时提示用浏览器打开 一,需求分析 1.1,使用微信或QQ打开网址时,无法在微信或QQ内打开常用下载软件,手机APP等.故此需要在微信qq里提示 二,功能实现 2.1 html实现 &l ...