1. 排序算法
1.1 冒泡排序
冒泡
- 重复的遍历序列,一次完成相邻两个元素的比较,如果不符合规则-进行位置交换
- 遍历这个序列直到没有元素可以进行交换代表冒泡排序完成。
List = [1,10,9,2,3] # 第一轮排序:第一个值 第二个值。 比较较大值-放到序列最后位置 List[0],List[1] #不重新排序 List[1],List[2] #颠倒次序 ''' 算法描述: 将较大的数值移动到列表的最后一位 第一轮比较-找到了列表中最大的值,经过操作,最大的值位与列表的最后一位: List[0]与List[1]进行比较: List[0]<List[1] 不需要调换顺序 [1,10...] List[1]与List[2]进行比较: List[1]>List[2] 需要调换顺序[1,9,10...] List[2]与List[3]进行比较: List[2]>List[3] 需要调换顺序[1,9,2,10...] List[3]与List[4]进行比较: List[3]>List[4] 需要调换顺序[1,9,2,3,10] 第二轮比较-找到第二大的数值 ''' def orderBubble(L): length = len(L) for i in range(length-1): for j in range(length-1-i): if L[j]>L[j+1]: L[j],L[j+1] = L[j+1],L[j] return L if __name__ == '__main__': L = [1,10,9,2,3] print(orderBubble(L))
1.2 插入排序
插入排序
- 通过构建一个有序的序列,对于未排序的数据在已排序的序列中从后向前进行扫描,找到了相应的位置后完成插入。
- 插入排序在实现上,需要把已经排序的元素逐步的向后进行移动
''' List = [1,10,9,2,3] 从小到大对序列进行排序 第一步: 找到序列中的第一个元素 1,将这个元素放到第一个位置[1,...] 第二步: 找到第二个元素10, 将这个10与排序完成的元素进行比较 List[0]<List[1] 满足排序规则,不进行顺序颠倒 第三步: 找到第三个元素9,将这个元素与排好顺序的List[0],List[1]进行比较,按照规则List[1]>List[2],需要颠倒顺序 第四步:.... 第五步:.... ''' def orderInsert(L): lengh = len(L) for i in range(1,lengh): value = L[i] indexInsert = -1 for j in range(i-1,-1,-1): if value<L[j]: L[j+1] = L[j] indexInsert = j else: break if indexInsert != -1: L[indexInsert] = value return L if __name__ == '__main__': L = [1,10,9,2,3] print(orderInsert(L))
1.3 快速排序
递归排序
自身调用自身,调用的过程中相当于替换掉了循环
递归运算规模逐步缩减
递归明显出口
''' 斐波那契数列: 递归写 1,1,2,3,5,8,13,21... ''' def fib(n): if n<3: return 1 else: return fib(n-1)+fib(n-2) if __name__ == '__main__': print(fib(10))
快速排序
分治法策略对序列进行分割:较大的序列和较小的序列
步骤
- 挑选基准值:从序列中任意位置都可作为基准值
- 分割:重新排序,在比之前少的子序列中与基准值进行比较:比基准值大的元素放在基准值之前;比基准值小的元素放在基准值之后
- 递归操作子序列,实现排序
def orderQuick(L): if len(L)<2: return L else: pivot = L[0] # 与基准点数值进行对比 less = [x for x in L[1:] if x <=pivot] large = [y for y in L[1:] if y>pivot] # 递归调用 return orderQuick(less)+[pivot]+orderQuick(large) if __name__ == '__main__': L = [1, 10, 9, 2, 3] print(orderQuick(L))
2. 链表
链表属于线性结构:数据结构中的一种
除了第一个成员以外,每个成员都有唯一一个前驱
除了最后一个成员以外,每个成员都有唯一一个后继
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tf633VR8-1598010620062)(E:\PythonProject\上课\实训课\2002正式班\day19_数据结构\链表.png)]
用途
- 计算机:内存空间有限,连续内存地址的内存空间就更少,当需要进行线性存储时,链表就是首选
2.1 节点链
节点
链表成员就是节点
什么样的数据容器适合做链表的节点?
# 创建节点 class Node: def __init__(self, dataval, nextval=None): self.dataval = dataval self.nextval = nextval # 创建一个链式结构:存储Mon,Tue,Wen D1 = Node('Mon') D2 = Node('Tue') D3 = Node("Wen") D1.nextval = D2 D2.nextval = D3 # 遍历这个链式结构 node = D1 while node: print(node.dataval) node = node.nextval
2.2 链表
- 一系列数据元素,通过链接形式串到一起。每个元素都是以指针的形式包含另外一个元素的链接
- Python中没有链表属性形式。需要创建链表,并且实现这种数据结构的:创建、更新、删除、遍历等操作
- 创建
- 遍历:计算长度、遍历成员
- 插入新节点:
- 头插法:找到链表头部,将新建的节点插入链表的头部
- 尾插法:找到链表尾部,将新建节点插入到链表为节点之后即可
- 按位置插入:根据索引下标位置插入节点
- 删除:从指定位置删除一个节点,重新的组织这个链表结构
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Software: PyCharm ''' class Node: def __init__(self, dataval, nextval=None): self.dataval = dataval self.nextval = nextval class LinkList: # 创建链表, header属性作为链表头指针,指向链表的第一个节点 def __init__(self): self.header = None # 遍历链表 def listprint(self): cur = self.header while cur != None: print(cur.dataval,end='\t') cur = cur.nextval print() # 求长度 def getLength(self): length = 0 cur = self.header while cur!=None: length+=1 cur = cur.nextval return length # 头插法 def headerInsert(self, newdata): # 将新的数据转换为节点 NewNode = Node(newdata) # 获取头节点 cur = self.header self.header = NewNode NewNode.nextval = cur # 尾插法 def endInsert(self,newdata): NewNode = Node(newdata) if self.header == None: self.header = NewNode else: cur = self.header while cur.nextval !=None: cur = cur.nextval cur.nextval = NewNode # 按照位置插入节点 def Insert(self, newdata, index): NewNode = Node(newdata) if index<=0: self.headerInsert(newdata) elif index>=self.getLength(): self.endInsert(newdata) else: cur = self.header for i in range(index-1): cur = cur.nextval NewNode.nextval = cur.nextval cur.nextval = NewNode # 从指定位置删除一个节点,重新的组织这个链表结构 def Delete(self ,Index): if self.header==None: print('Empty linklist!') if Index < 0 or Index >self.getLength(): print('Error Index!') cur = self.header for i in range(Index-1): cur = cur.nextval cur.nextval = cur.nextval.nextval if __name__ == '__main__': list1 = LinkList() list1.header = Node('Mon') e2 = Node('Tue') e3 = Node('Wen') list1.header.nextval = e2 e2.nextval = e3 list1.listprint() print(list1.getLength()) list1.headerInsert('Sun') list1.listprint() list1.endInsert('Thu') list1.listprint() list1.Insert('Sat',1) list1.listprint() list1.Delete(1) list1.listprint() ''' #!--*-- coding="utf8" --*--- class Node: def __init__(self,elem): self.elem=elem self.next=None class SingleLink: def __init__(self,node=None): self.head=node def is_empty(self): return self.head==None def length(self): cur = self.head count = 0 while cur != None: count += 1 cur = cur.next return count def travel(self): cur = self.head while cur!=None: print(cur.elem,end=" ") cur=cur.next def add(self,item): node = Node(item) node.next=self.head self.head=node def append(self,item): node=Node(item) if self.is_empty(): self.head=node else: cur=self.head while cur.next!=None: cur=cur.next cur.next=node def insert(self,pos,item): if pos<=0: self.add(item) elif pos > self.length()-1: self.append(item) else: pre=self.head count=0 while count < (pos-1): count+=1 pre= pre.next node=Node(item) node.next=pre.next pre.next=node def remove(self,item): cur=self.head pre=None while cur != None: if cur.elem==item: if cur==self.head: self.head=cur.next else: pre.next=cur.next break else: pre=cur cur=cur.next def search(self,item): cur=self.head while cur!=None: if cur.elem==item: return True else: cur=cur.next return False if __name__ == '__main__': ll=SingleLink() print(ll.is_empty()) print(ll.length()) ll.append(1) print(ll.is_empty()) print(ll.length()) ll.append(1) ll.add(8) ll.append(2) ll.append(3) print(ll.is_empty()) print(ll.length()) ll.insert(-1,11) ll.insert(10,13) ll.remove(2) ll.remove(11) ll.remove(13) ll.remove(8) ll.remove(1) ll.remove(1) ll.remove(3) ll.remove(2) ll.travel()
3. 作业
邮箱:616971722@qq.com
实现链表搜索功能
def search(self, value):
pass
实现链表的反转
def reverse(self):
ll.remove(2)
ll.remove(11)
ll.remove(13)
ll.remove(8)
ll.remove(1)
ll.remove(1)
ll.remove(3)
ll.remove(2)
ll.travel()
3. 作业
邮箱:616971722@qq.com
实现链表搜索功能
def search(self, value):
pass
实现链表的反转
def reverse(self):
pass