day20

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值