Python篇——数据结构与算法(第一部分)

news2025/1/16 13:47:21

 

目录

一、查找

1、顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。

2、二分查找:也叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

二、排序

1、冒泡排序(原地排序)

2、选择排序 

3、插入排序

4、快速排序


一、查找

查找:在一些数据元素中、通过一定的方法找出与给定关键字相同数据元素的过程

列表查找(线性表查找):从列表中查找指定元素

        输入:列表、待查找元素

        输出:元素下标(未找到元素时一般返回None或-1)

内置列表查找函数:index()(底层就是顺序查找,因为二分查找需要有序列表

1、顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止。

 顺序查找例子:

def linea_search(li, val):
    for index, v in enumerate(li):
        if v == val:
            return index
    else:
        return None
        # print(index)
        # print(v)


if __name__ == '__main__':
    line = linea_search([1, 2, 3, 4, 5, 6, 7], 7)
    print(line)

2、二分查找:也叫折半查找,从有序列表的初始候选区li[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半。

 二分查找例子:

def binary_search(list, val):
    left = 0
    right = len(list) - 1
    while left <= right:
        mid = (left + right) // 2
        if list[mid] == val:
            return mid
        elif list[mid] > val:
            right = mid - 1
        else:
            left = mid + 1
    else:
        return None


if __name__ == '__main__':
    a = binary_search([1, 2, 3, 4, 5, 6], 3)
    print(a)

二、排序

  • 什么是列表排序
  • 常见排序算法
  • 排序算法分析

排序:将一组“无序”的记录序列调整为“有序”的记录序列

列表排序:将无序列表变为有序列表

        输入:列表

        输出:有序列表

升序(小到大)、降序(大到小)

内置排序函数:sort()

常见排序算法:

冒泡排序、选择排序、插入排序

快速排序、堆排序、归并排序

希尔排序、计数排序、基数排序

1、冒泡排序(原地排序)

  • 列表每相邻的两个数,如果前面的比后面的大,则交换这两个数

  • 一趟排序完成后,无序区少一个数,有序区多一个数

import random


def buffer_search(n):
    for i in range(len(n) - 1):  # 趟数
        exchange = False
        for j in range(len(n) - i - 1):
            if n[j] > n[j + 1]:
                n[j], n[j + 1] = n[j + 1], n[j]
                exchange = True
            else:
                exchange = False
        if not exchange:
            break
        print(n)


if __name__ == '__main__':
    # li = [random.randint(0, 10000) for i in range(10)]
    # print("len(li):", len(li))
    # print(li)
    # buffer_search(li)
    # print(li)

    li2 = [9, 8, 7, 1, 2, 3, 4, 5, 6]
    buffer_search(li2)

Note:

  • 整个冒泡排序只需要走n-1躺,因为最后剩下的一定是最小的
  • 代码关键点:趟数、无序区范围
  • 趟数n-1
  • 第一趟可以确定一个数到有序区,那么无序区范围是n-i-1,还剩n-i个数
  • 复杂度O(n^2)
  • 改进点:如果列表中没有发生数字的交换、那么就是已经排好序了,例如: li2 = [9, 8, 7, 1, 2, 3, 4, 5, 6]

2、选择排序 

  • 每一趟选择一个最小的放入新列表
def select_search_1(li):
    li_new = []
    for i in range(len(li)):
        min_val = min(li)
        li_new.append(min_val)
        li.remove(min_val)
    return li_new

缺点:remove()操作和min()操作,增大了开销,并且增加了一个新列表li_new[]。不是原地排除

改进:

def select_search_2(li):
    '''改进'''
    for i in range(len(li)):
        min_loc = i
        for j in range(i + 1, len(li)):
            if li[j] < li[min_loc]:
                min_loc = j
        li[i], li[min_loc] = li[min_loc], li[i]
        print('i:%s,li:%s', i, li)
  •  原地排序,第一趟,找到无序区最小的数与第一个数进行交换位置,第二趟找到无序区最小的数与第二个位置进行交换,以此类推
  • 将列表在排序的过程中划分为了有序区和无序区
  • 时间复杂度O(n^2)

3、插入排序

  • 初始时手里(有序区)只有一张牌
  • 每次(从无序区)摸一张牌,插入到自己手里已经有牌的正确位置

 

def inseart_search(list):
    for i in range(1, len(list)):
        temp = list[i]
        j = i - 1
        while j >= 0 and list[j] > temp:
            list[j + 1] = list[j]
            j -= 1
        list[j + 1] = temp
        print(list)

if __name__ == '__main__':
    list = [3, 2, 5, 7, 4, 1, 9, 8, 6]
    inseart_search(list)

Note:

 for i in range(1, len(list)):

  •  i 表示摸到的牌的下标

        j = i - 1

  •  j指的是手里的牌的下标
  • 时间复杂度O(n^2)

4、快速排序

  • 快速排序思路:
  • 取一个元素p(第一个元素),使元素p归位
  • 列表被p分成两部分,左边都比p小,右边都比p大
  • 递归完成排序
  • 时间复杂度:O(nlogn)
  • 快速排序问题:
    • 递归
    • 最坏情况:例如 [9,8,7,6,5,4,3,2,1] 这时候时间复杂度为 O(n^2)
    • 解决思路:随机找一个数与第一个数进行先交换,在进行快速排序。

def partition(list, left, right):
    temp = list[left]  # 存值
    while left < right:
        while left < right and list[right] >= temp:
            right -= 1
        list[left] = list[right]
        while left < right and list[left] <= temp:
            left += 1
        list[right] = list[left]
    list[left] = temp
    return left


def quick_sort(list, left, right):
    if left < right:
        mid = partition(list, left, right)
        quick_sort(list, mid + 1, right)
        quick_sort(list, left, mid - 1)


if __name__ == '__main__':
    list = [3, 2, 5, 6, 8, 9, 1, 7, 4]
    # 单步测试
    # partition(list, 0, len(list) - 1)
    # print(list)
    quick_sort(list, 0, len(list) - 1)
    print(list)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【远程访问】Linux搭建SVN服务器,并内网穿透实现公网远程访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

C++入门预备语法

C入门预备语法 C关键字命名空间C输入&输出初步缺省参数函数重载引用内联函数auto和范围for&#xff08;C11&#xff09;指针空值nullptr C关键字 命名空间 命名空间是一种将变量名、函数名、类名和库名称等封装到一个命名空间域中&#xff0c;与其他域的同名量相隔离&…

【AUTOSAR】【以太网】SomeIpTp

目录 一、概述 二、限制与约束 三、功能说明 3.1 SOME/IP帧头 3.1.1 消息类型字段 3.1.2 偏移字段 3.1.3 更多段标志 3.1.4 示例 3.2 错误分类 3.2.1 开发错误 3.2.2 运行错误 四、API接口 4.1 API定义 4.2 回调接口 4.3 调度接口 一、概述 规范规定了AUTOSAR 基…

知识付费:创客匠人的发展转型之路

互联网时代到来后&#xff0c;知识付费行业以极快的速度崛起&#xff0c;让最早入局的人赚得盆满钵满&#xff0c;同时&#xff0c;也有很多人想进入行业发展&#xff0c;却没有真正打造好自己的平台&#xff0c;无法形成系统成熟的企业。如今&#xff0c;行业发展趋势还在不断…

案例19:Java私房菜定制上门服务系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

小型双轮差速底盘实现红外避障功能

1. 功能说明 在R023e机器人车体上安装1个近红外传感器&#xff0c;实现机器人小车避障功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1扩展板…

VS2022 CUDA环境配置

文章目录 安装准备新建项目 安装准备 配置Cuda环境主要分为以下几个步骤 安装VS 这个应该不用太说&#xff0c;直接装最新版安装CUDA 下载地址&#xff1a;Cuda Toolkit安装cuDNN 下载地址&#xff1a;cuDNN archieve 这个安装顺序非常重要&#xff0c;一定是先装VS后装CUDA…

19 # promisify:将回调方法 promise 化

之前写个单独的方法去处理文件读取 function read(filename) {return new Promise((resolve, reject) > {fs.readFile(filename, "utf-8", function (err, data) {if (err) reject(err);resolve(data);});}); }将 node 的 api 快速的转化成 promise 的形式 cons…

Linux基于Apache服务搭建简易镜像站

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Linux基于Apache服务搭建简易镜像站 安装Apache服务器 yum install -y httpd.x86_64 配置Apache服务器&#xff1a;编辑Apache配置文件/etc/httpd/conf/httpd.conf #S…

深度学习 - 50.推荐场景下的 Attention And Multi-Head Attention

目录 一.引言 二.Attention 1.Common Attention 2.Google Attention 三.Multi-Head Attention 四.总结 一.引言 Attention 注意力机制最早来源于我们自身的视觉感官&#xff0c;当我们视觉获取到图像信息时&#xff0c;我们并不是从前往后从上往下均匀的扫描画面&#x…

如何用FinalShell连接VirtualBoxLinux虚拟机?

本章教程&#xff0c;主要介绍一下如何用FinalShell连接VirtualBoxLinux虚拟机。 当安装完虚拟机的时候&#xff0c;你可能会遇到找不到ifconfig命令。这个是因为当时安装过程中&#xff0c;我们选择的是最小化安装&#xff0c;所以有些命令是需要按需进行安装的。 目录 1、li…

JavaScript:原型、原型链、继承

一、理解原型 1.1、人工智能解释 JavaScript中的原型是一种机制&#xff0c;它允许在创建对象时共享属性和方法。每个JavaScript对象都有一个原型对象&#xff0c;它包含一些公共属性和方法&#xff0c;可以被该对象和其他对象共享。 当你创建一个对象时&#xff0c;Javascr…

案例13:Java社区帮扶对象管理系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

HTML+CSS实训——Day01——安装好环境+写一个简单的应用启动页面

前言 学校最近开始实训周了&#xff0c;一上就是一个月&#xff0c;本来想在课上学点考研的东西的&#xff0c;但是无奈任务重&#xff0c;而且最后还能有点小奖励&#xff0c;就认真学了&#xff0c;再者说&#xff0c;html也挺重要的&#xff0c;学一学也不算浪费时间。 软…

【JUC】Synchronized与锁升级

【JUC】Synchronized与锁升级 文章目录 【JUC】Synchronized与锁升级1. 概述1.1 无锁1.2 偏向锁 1. 概述 用锁能够实现数据的安全性&#xff0c;但是会带来性能下降。无锁能够基于线程并行提升程序性能&#xff0c;但是会带来安全性下降。如何达到两者的平衡呢&#xff1f; s…

VuePress V1 踩坑记录

文章目录 前言1.Node.js 版本问题2.侧边栏3.添加页面目录导航4.非首页 footer 不生效5.部署到 Github 的错误vuepress 的 docs 与 Github Pages 的 docs 目录冲突样式丢失 7.资源引用问题本地图片找不到引用 CSDN 图片报 403 错误 参考文献 前言 我的第二本开源电子书《后台开…

Raft集群变更:This article is all your need

Background 为了变化raft集群&#xff0c;我们可以选择&#xff1a;.停在旧配置&#xff0c;然后再上线新配置 。但是这个会导致整个集群变得不可用&#xff0c;同时手动修改也会到来问题。 所以我们采用热变更 这也导致了安全性的问题&#xff0c;变更过程有可能导致两个le…

miniconda安装+pycharm安装

miniconda安装pycharm安装 1.miniconda安装2.pycharm安装3.pycharm环境配置 1.miniconda安装 miniconda下载路径&#xff1a;https://docs.conda.io/en/latest/miniconda.html 打开后选择对应的电脑系统及python版本下载 下载完成后双击运行 选择安装路径&#xff0c;记住安装…

SpringCloud Eureka 的详细讲解及示意图

目录 SpringCloud Eureka 服务注册与发现 Spring Cloud 组件选型- 图 当前项目架构问题分析-引出Eureka 一图胜千言 问题分析 引入Eureka 项目架构 解读上图 Eureka采用了 CS 的设计架构&#xff0c; 创建单机Eureka Server-注册中心 创建e-commerce-eureka-server-90…

【深度学习】- 作业3: CIFAR10图像分类

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…