python进阶_Day8

思维导图:

1.链表与顺序表(续):

2.排序:

作业:(有条件的也可以选择下载资源,资源里的代码会有详细的注释,但是代码相同。)

1.链表:

python 复制代码
# 单向链表
# 链表单个结点(single node)的实现:前驱(predecessor)后继(successor)
from itertools import count


class SingleNode(object):
    """
    单向结点
    """

    def __init__(self, item, next=None):
        self.item = item
        self.next = next


# 链表两边对象(SingleLinkList)单链路列表的实现
class SingleLinkList(object):
    """
    单项链表
    """

    def __init__(self, node=None):
        self.head = node
        self.tail = None

    def is_empty(self):
        """链表是否为空"""
        if self.head is None:
            return True
        else:
            return False

    def length(self):
        """链表长度"""
        cur = self.head
        count = 0
        while cur is not None:
            count += 1
            cur = cur.next
        return count

    def travel(self):
        """遍历整个链表"""
        cur = self.head
        print('链表中的元素:', end=' ')
        while cur is not None:
            print(cur.item, end=' ')
            cur = cur.next
            if cur is None:
                print()
                break

    def add(self, item):
        """链表头部添加元素"""
        node = SingleNode(item)
        node.next = self.head
        self.head = node

    def append(self, item):
        """链表尾部添加元素"""
        if self.head is None:
            self.head = SingleNode(item)
            return
        else:
            cur = self.head
            while cur.next is not None:
                cur = cur.next
            cur.next = SingleNode(item)
            return

    def insert(self, pos, item):
        """指定位置添加元素"""
        if pos == 0:
            self.add(item)
            return
        elif pos >= self.length():
            self.append(item)
            return
        elif 0 <= pos <= self.length():
            cur = self.head
            count = 0
            while count < pos - 1:
                count += 1
                cur = cur.next
            node = SingleNode(item)
            node.next = cur.next
            cur.next = node

    def remove(self, item):
        """删除节点"""
        if self.head is None:
            print('链表为空')
            return
        cur = self.head
        pre = None
        if cur.item == item:
            self.head = cur.next
            return
        else:
            while cur is not None:
                if cur.item == item:
                    pre.next = cur.next
                    return
                else:
                    pre = cur
                    cur = cur.next
            print('未找到')

    def search(self, item):
        """查找节点是否存在"""
        cur = self.head
        while cur is not None:
            if cur.item == item:
                return True
            cur = cur.next
        return False


def test1(data):
    """测试链表实例化"""
    mynode = SingleNode(data)
    print('mynode--->', mynode)
    linklist = SingleLinkList(mynode)
    print('linklist--->', linklist)
    print(mynode.item)
    print(linklist.head)
    print(linklist.head.item)
    print(linklist.head.next)


def test2(data):
    """测试列表判空,长度,遍历"""
    # 实例化结点和链表对象
    mynode = SingleNode(data)
    linklist = SingleLinkList(mynode)
    # linklist = SingleLinkList()
    # 判空
    print(linklist.is_empty())
    print('链表长度为:', linklist.length())
    linklist.travel()


def test3(data):
    """插入节点"""
    # mynode = SingleNodse(data)
    # linklist = SingleLinkList(mynode)
    linklist = SingleLinkList()
    linklist.add(12)
    linklist.add(34)
    linklist.add(56)
    linklist.travel()
    linklist.append(98)
    linklist.append(76)
    linklist.append(54)
    linklist.travel()
    linklist.insert(2, 11)
    linklist.travel()
    linklist.remove(34)
    linklist.travel()
    print(linklist.search(34))
    print(linklist.search(11))


if __name__ == '__main__':
    test1(1)
    test2(2)
    test3(3)

2.排序

(1)冒泡排序

python 复制代码
from itertools import count


def bubble_sort(mylist):
    n = len(mylist)
    for i in range(n-1):
        for j in range(0, n-i-1):
            if mylist[j] > mylist[j+1]:
                mylist[j], mylist[j+1] = mylist[j+1], mylist[j]

def bubble_sort2(mylist):
    n = len(mylist)
    count = 0
    for i in range(n-1):
        for j in range(0, n-i-1):
            if mylist[j] > mylist[j+1]:
                mylist[j], mylist[j+1] = mylist[j+1], mylist[j]
                count += 1
        if count == 0:
            break

if __name__ == '__main__':
    mylist = [12,9,67,4,32,65,34]
    bubble_sort(mylist)
    print(mylist)

(2)选择排序

python 复制代码
def selectionsort1(list1):
    mylist = list1.copy()
    for i in range(len(mylist)-1):
        min_index = i
        for j in range(i+1,len(mylist)):
            if mylist[j] < mylist[min_index]:
                min_index = j
        if min_index != i:
            mylist[i], mylist[min_index] = mylist[min_index], mylist[i]
    return mylist



def selectionsort2(list2):
    mylist = list2.copy()
    for i in range(len(mylist)):
        max_index = i
        for j in range(i+1,len(mylist)):
            if mylist[j] > mylist[max_index]:
                max_index = j
        if max_index != i:
            mylist[i], mylist[max_index] = mylist[max_index], mylist[i]
    return mylist

if __name__ == '__main__':
    mylist = [12,543,8,9,4,1,0]
    print(selectionsort1(mylist))
    print(selectionsort2(mylist))

(3)插入排序

python 复制代码
def insertion_sort(list1):
    mylist = list1[:]
    for i in range(1, len(mylist)-1):
        for j in range(i,0,-1):
            if mylist[j]<mylist[j-1]:
                mylist[j],mylist[j-1]=mylist[j-1],mylist[j]
    return mylist
if __name__ == '__main__':
    mylist = [12,4,32,67,92,32,1,2,5]
    print(insertion_sort(mylist))

(4)快速排序

python 复制代码
def quicksort(mylist,start,end):
    if start>end:
        return
    left = start
    right = end
    mid = mylist[start]
    while left < right:
        while mylist[right] >= mid and left < right:
            right -= 1
        mylist[left] = mylist[right]
        while mylist[left] <=mid and left < right:
            left += 1
        mylist[right] = mylist[left]
    mylist[right] = mid

    quicksort(mylist,right+1,end)
    quicksort(mylist,start,left-1)
if __name__ == '__main__':
    mylist = [12,35,98,4,5,2,8,6,10,3,8,0,2,4,6,8,100]
    quicksort(mylist,0,len(mylist)-1)
    print(mylist)
相关推荐
姬嘉晗-19期-河北工职大3 小时前
HCL设备启动失败
python·终端·anaconda·解释器
蓝天智能3 小时前
QT QML交互原理:信号与槽机制
开发语言·qt·交互
淬炼之火3 小时前
基于pycharm和anaconda的yolo简单部署测试
python·深度学习·yolo·pycharm·ultralytics
十五年专注C++开发4 小时前
C++类型转换通用接口设计实现
开发语言·c++·跨平台·类设计
im_AMBER4 小时前
杂记 15
java·开发语言·算法
麦麦大数据4 小时前
F024 CNN+vue+flask电影推荐系统vue+python+mysql+CNN实现
vue.js·python·cnn·flask·推荐算法
Zzz 小生4 小时前
编程基础学习(一)-Python基础语法+数据结构+面向对象全解析
开发语言·python
white-persist4 小时前
JWT 漏洞全解析:从原理到实战
前端·网络·python·安全·web安全·网络安全·系统安全
沐知全栈开发4 小时前
Bootstrap4 表格详解
开发语言