15分钟学Python 第19天 : 算法基础

news2024/9/30 17:40:10

Day19: 算法基础

目录

  1. 算法基础概述
  2. 时间复杂度和空间复杂度
  3. 排序算法
    • 冒泡排序
    • 插入排序
    • 选择排序
    • 快速排序
    • 归并排序
  4. 搜索算法
    • 线性搜索
    • 二分搜索
  5. 练习题
  6. 项目作业

1. 算法基础概述

算法是解决问题的一系列步骤。在计算机科学中,算法通常用于处理数据、执行计算以及完成任务。了解算法的基本概念是编程的重要组成部分,它可以帮助我们解决问题、优化程序和提高运行效率。

2. 时间复杂度和空间复杂度

在分析算法的效率时,时间复杂度和空间复杂度是两个重要的指标。

表示描述
O ( n ) O(n) O(n)线性时间复杂度
O ( n 2 ) O(n^2) O(n2)平方时间复杂度
O ( log ⁡ n ) O(\log n) O(logn)对数时间复杂度
O ( 1 ) O(1) O(1)常数时间复杂度
  • 时间复杂度:表示算法执行所需时间,相对于输入规模的增长率。
  • 空间复杂度:表示算法运行所需内存空间的大小,相对于输入规模的增长率。

3. 排序算法

排序算法在数据处理领域至关重要。我们将介绍几种常见的排序算法。

3.1 冒泡排序

冒泡排序是最简单的排序算法,基本思想是通过交换相邻的逆序元素,将最大(或最小)的元素“冒泡”到序列的一端。

冒泡排序示例代码
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr

# 示例运行
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr)
print("Sorted array:", sorted_arr)
运行流程图
开始
  |
  V
初始化 n = len(arr)
  |
  V
外层循环 i 从 0 到 n-1
  |
  V
  内层循环 j 从 0 到 n-i-1
    |
    V
    如果 arr[j] > arr[j+1]
      |
      V
      交换 arr[j] 和 arr[j+1]
  |
  V
结束
3.2 插入排序

插入排序通过构建一个有序序列,逐步将元素插入到正确的位置。它的效率较高,尤其是在处理几乎排好序的数据时。

插入排序示例代码
def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

# 示例运行
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("Sorted array:", sorted_arr)
运行流程图
开始
  |
  V
外层循环 i 从 1 到 len(arr)-1
  |
  V
设置 key = arr[i]
  |
  V
内层循环 j 从 i-1 到 0
  |
  V
如果 key < arr[j]
  |
  V
  arr[j+1] = arr[j]
  |
  V
结束
3.3 选择排序

选择排序通过选择未排序部分的最小元素,将其放在已排序序列的末尾。

选择排序示例代码
def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

# 示例运行
arr = [64, 25, 12, 22, 11]
sorted_arr = selection_sort(arr)
print("Sorted array:", sorted_arr)
运行流程图
开始
  |
  V
外层循环 i 从 0 到 n-1
  |
  V
设置 min_idx = i
  |
  V
内层循环 j 从 i+1 到 n
  |
  V
如果 arr[j] < arr[min_idx]
  |
  V
  min_idx = j
结束
3.4 快速排序

快速排序是分治法的一种应用。它通过一个基准元素将数据分为左右两部分,左边是小于基准的元素,右边是大于基准的元素。

快速排序示例代码
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

# 示例运行
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quick_sort(arr)
print("Sorted array:", sorted_arr)
运行流程图
开始
  |
  V
如果 len(arr) <= 1 返回 arr
  |
  V
选择 pivot
  |
  V
创建 left, middle, right 列表
  |
  V
递归调用 quick_sort
  |
  V
合并并返回结果
结束
3.5 归并排序

归并排序也是分治法。它将数组分成两个部分,分别排序后再合并。

归并排序示例代码
def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)

def merge(left, right):
    sorted_array = []
    while left and right:
        if left[0] < right[0]:
            sorted_array.append(left.pop(0))
        else:
            sorted_array.append(right.pop(0))
    sorted_array.extend(left)
    sorted_array.extend(right)
    return sorted_array

# 示例运行
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Sorted array:", sorted_arr)
运行流程图
开始
  |
  V
如果 len(arr) <= 1 返回 arr
  |
  V
找到 mid
  |
  V
分别对左右两部分递归调用 merge_sort
  |
  V
合并两个有序数组
  |
  V
返回合并结果
结束

4. 搜索算法

搜索算法用于在数据结构中查找特定元素。我们将介绍两种常见的搜索算法:线性搜索和二分搜索。

4.1 线性搜索

线性搜索是从数组的一个端开始,逐个比较元素,直到找到目标元素。

线性搜索示例代码
def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

# 示例运行
arr = [2, 3, 4, 10, 40]
target = 10
result = linear_search(arr, target)
print("Element found at index:", result)
运行流程图
开始
  |
  V
外层循环 i 从 0 到 len(arr)-1
  |
  V
如果 arr[i] == target
  |
  V
返回 i
  |
  V
结束
4.2 二分搜索

二分搜索适用于已排序的数组。通过比较中间元素,并决定在左半部分还是右半部分继续查找,达到快速查找的目的。

二分搜索示例代码
def binary_search(arr, target):
    low = 0
    high = len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] < target:
            low = mid + 1
        elif arr[mid] > target:
            high = mid - 1
        else:
            return mid
    return -1

# 示例运行
arr = [2, 3, 4, 10, 40]
target = 10
result = binary_search(arr, target)
print("Element found at index:", result)
运行流程图
开始
  |
  V
设置 low = 0, high = len(arr) - 1
  |
  V
循环条件 low <= high
  |
  V
设置 mid = (low + high) // 2
  |
  V
比较 arr[mid] 与 target
  |
  V
根据结果调整 low 或 high
  |
  V
结束

5. 练习题

  1. 实现一个选择排序算法,给定任意整数数组,返回排序后的数组。
  2. 编写一个快速排序算法,使用递归来分治。
  3. 编写线性搜索和二分搜索的对比代码,给定一个随机整数数组及目标值,比较两种搜索的效率。
  4. 想象你是一名数据分析师,给定一个包含学生成绩的数组,请使用归并排序来对成绩进行排序,并使用二分搜索来查找某个特定的成绩。

6. 项目作业

请尝试完成以下项目作业:

  • 选择一个数据集(如电子商务网站的商品价格),实现合适的排序算法对其进行排序,并结合搜索算法查找特定商品的价格。
  • 尝试实现一个图形用户界面(GUI),允许用户输入一组数字,选择排序算法,然后查看排序和搜索结果。

怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!

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

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

相关文章

VMware复制Ubuntu虚拟机后网卡失效的问题

为了在个人电脑上搭建集群&#xff0c;我使用了多台VMware虚拟机来模拟集群主机。之前虚拟机的操作系统是Redhat时&#xff0c;我复制虚拟机后网卡功能没有问题&#xff0c;但这次换成Ubuntu操作系统&#xff0c;我复制了虚拟机后同时启动这两台虚拟机&#xff0c;其中一台虚拟…

软件测试谣言二三事,认真你就输了

软件测试在近几年关注度日益升高,这得益于行业快速发展,以及很多公司和国际接轨后,对质量要求的增高。 在网上相关的讨论中,有许多观点并不符合我在这个行业的感知,针对一些观点,在这里结合我自己多年的从事经验,给大家辟辟谣。 谣言一:软件测试入门容易,会点点点就…

vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写

先来看下需要实现的效果 当鼠标放在左侧图标上时&#xff0c;可以拖动整个列表元素&#xff0c;调整顺序 思路介绍 使用draggable可以设置元素可拖动&#xff0c;然后分别设置三个事件处理函数&#xff0c;监听onDragstart、onDragover、onDragend三个事件 注意&#xff1a…

基于STM32的智能温度监控系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 传感器数据采集与处理温度监控与报警显示功能应用场景结论 1. 引言 温度监控系统在许多应用场景中具有重要作用&#xff0c;例如工业、农业以及家居生活。通过使用STM32微控制器、温度传…

Excel:常用函数

一、DAYS&#xff08;返回两个日期之间的天数&#xff09; 以下演示是在windows操作系统环境&#xff0c;office软件进行操作的 1.1 单元格设置日期格式 1.2 设置Days函数 公式&#xff1a;DAYS(C2,B2) 全部天数 二、SUM&#xff08;求和&#xff09; 公式&#xff1a;SUM(…

第二届两岸新经济产业发展研讨会闭幕,爱迪斯通董事长发表演讲

9月29日&#xff0c;第二届两岸新经济产业发展研讨会在福州高新区圆满落幕。此次研讨会由清华大学两岸发展研究院主办&#xff0c;福州市招商行动领导小组办公室、福州高新区承办&#xff0c;汇聚了两岸的专家学者及企业家代表近200人&#xff0c;共同探讨新质生产力的发展与两…

宠物医院微信小程序源码

文章目录 前言研究背景研究内容一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.系统分析3.数据表信息4.运行截图5.部分代码介绍 总结 前言 随着当代社会科技的迅速发展&#xff0c;计算机网络时代正式拉来帷幕&#xff0c;它颠覆性的影响着社会…

【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验

前言 分析时Tessy的报错 1.fatal error: Tricore/Compilers/Compilers.h: No such file or directory 2.error: #error "Compiler unsupported" 3.warning: invalid suffix on literal;C11 requires a space between literal and string macro 4.error: unknown…

YOLOv7改进:Unified-loU,用于高品质目标检测的统一loU ,2024年8月最新IoU

💡💡💡现有IoU问题点:IoU (Intersection over Union)作为模型训练的关键,极大地显示了当前预测框与Ground Truth框之间的差异。后续研究者不断在IoU中加入更多的考虑因素,如中心距离、纵横比等。然而,仅仅提炼几何差异是有上限的;而且新的对价指数与借据本身存在潜在…

优化Mysql

目录 Mysql优化就四种&#xff1a;定位慢查询/sql执行计划/索引/Sql优化经验... 2 1Mysql如何定位慢查询&#xff1f;... 2 2Sql语句执行很慢&#xff0c;如何分析呢&#xff1f;... 3 2.1那这个SQL语句执行很慢,如何分析呢?. 3 3&#xff0e;了解过索引吗?(什么是索引)…

DC00018基于java swing+MySQL花卉信息管理系统

1、项目功能演示 DC00018基于java swingMySQL花卉信息管理系统java项目信息管理系统 2、项目功能描述 基于java swingMySQL花卉信息管理系统 系统包括用户信息管理以及花卉信息管理等功能。 3、项目运行截图 4、项目核心代码 4.1 日期格式化 package utils;import java.t…

C++ STL容器(四) —— vector底层剖析

这篇讲解vector&#xff0c;不说废话&#xff0c;直接开始&#xff01; 文章目录 原理UML类图代码实现构造函数插入元素删除元素清空容器析构函数赋值运算符 案例分析 原理 这里简单说一下 vector 的大致思想&#xff0c;动态数组&#xff0c;即它的长度会随着我们插入元素而产…

【YOLO目标检测二维码数据集】共3112张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;3112 标注数量(txt文件个数)&#xff1a;3112 标注类别数&#xff1a;1 标注类别名称&#xff1a;qrcode 数据集下载&#xff1a;二维码数据集 图片示例 数据集图片&#xff1a; 数据集…

【开源免费】基于SpringBoot+Vue.JS微服务在线教育系统(JAVA毕业设计)

本文项目编号 T 060 &#xff0c;文末自助获取源码 \color{red}{T060&#xff0c;文末自助获取源码} T060&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【hot100-java】【合并两个有序链表】

记忆中&#xff0c;两个指针合并即可。 建立哨兵节点dum /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { t…

idea启动项目报错Command line is too long

idea启动项目报错 Command line is too long. Shorten command line for Idmap5CoreApplication or also for Spring Boot default configuration? 选择出问题的项目&#xff0c;shorten command line 选项选择 JAR manifest 或者 classpath file 选项

用责任链模式改造 if else

我的上一篇文章&#xff0c;因为if else 多了&#xff0c;捣鼓很久&#xff0c;今天用责任链模式改造一下。 代码写着写着&#xff0c;if else if 逻辑忘记了&#xff0c;哎。。。-CSDN博客 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 1. 什么是责任…

SpringBoot之Profile的两种使用方式

0. 需求 通常项目开发过程中&#xff0c;会经历多种环境转换&#xff0c;典型的如开发环境(dev)、测试环境(test)和生产环境(prod)。在这三种不同的环境下&#xff0c;连接数据库时使用的配置信息是不同的&#xff0c;即三个不同环境对应三个不同的数据库。 现在的需求是&#…

【论文导读】Graphusion (LLM + KGC)

序言 第一次论文出现在 《Leveraging Large Language Models for Concept Graph Recovery and Question Answering in NLP Education》 论文地址&#xff1a;https://arxiv.org/abs/2402.14293 七月份的时候应该是又改进了一次。但是又发了一篇新的地址&#xff1a;《Graphu…

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用

1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…