经典算法:查找与排序

查找

1. 线性查找

算法思想:

线性查找,也被称为顺序查找,是一种最简单的查找算法。它的基本思想是从表的一端开始,逐个检查表中的元素,直到找到所需的元素为止。如果表中不存在该元素,则查找失败。

具体实现:太简单,略过

2.二分查找

算法思想:

二分查找是一种在有序列表中查找某一特定元素的搜索算法。搜索过程从列表的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在列表大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤列表为空,则代表找不到。

具体实现

  • 初始化两个指针(或索引)low和high,分别指向列表的起始和结束位置。
  • 计算中间位置mid。
  • 将中间位置的元素与目标元素进行比较。
    • 如果相等,则返回mid作为目标元素的位置。
    • 如果目标元素大于中间元素,则将low更新为mid+1,继续在右半部分查找。
    • 如果目标元素小于中间元素,则将high更新为mid-1,继续在左半部分查找。
  • 重复步骤2和3,直到找到目标元素或low大于high(表示未找到)。
def binary_search(list, target):low = 0high = len(list) - 1while low <= high:mid = (low + high) // 2guess = list[mid]if guess == target:return midelif guess > target:high = mid - 1else:low = mid + 1return None  # 返回None表示查找失败

排序

基本排序算法

1.冒泡排序

算法思想:

冒泡排序是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这时该数列已经排序完成。

具体实现:

def bubble_sort(arr):n = len(arr)for i in range(n):# 提前退出标志swapped = Falsefor j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = True# 如果没有发生交换,说明数组已经有序,提前退出if not swapped:breakreturn arr# 示例
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr)
print("Sorted array is:", sorted_arr)

2.选择排序

算法思想:

选择排序的工作原理是将未排序序列中最小(或最大)元素存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

具体实现:

def selection_sort(arr):n = len(arr)for i in range(n):# 假设当前元素为最小值min_idx = ifor 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 is:", sorted_arr)

3.插入排序

算法思想:

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,找到相应位置并插入时,不需要移动元素(实际上是将大于插入元素的元素向后移动一位),只需将要插入的元素移到正确的位置即可。

具体来说,插入排序算法从数组的第二个元素开始,假设第一个元素已经被排序(即长度为1的有序序列)。然后,取出下一个元素,在已经排序的元素序列中从后向前扫描,找到相应位置并插入。重复以上步骤,直到所有元素都排序完毕。

具体实现:

def insertion_sort(arr):# 遍历数组,从第二个元素开始(因为第一个元素默认已排序)for i in range(1, len(arr)):key = arr[i]  # 当前需要插入的元素j = i - 1  # 已排序部分的最后一个元素的索引# 在已排序部分从后向前扫描,找到插入位置while j >= 0 and arr[j] > key:arr[j + 1] = arr[j]  # 将大于key的元素向后移动一位j -= 1# 插入key到正确位置arr[j + 1] = keyreturn arr# 示例
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("Sorted array is:", sorted_arr)

高级排序算法

1.归并排序

算法思想:

归并排序的核心思想是将一个大数组分成两个较小的子数组,分别进行排序,然后将排序好的两个子数组合并成一个有序的数组。这个过程可以递归地进行,直到每个子数组只包含一个元素或为空。归并排序类似于二叉树的后序遍历,会持续划分区间,直到区间内元素有序,然后利用额外空间对元素进行排序,并将它们合并回原区间,直至整个序列有序。

具体实现:

归并排序的具体实现可以分为递归和非递归两种方式。以下是递归实现的步骤:

  • 确定递归的结束条件,即当数组长度为1时,认为已经有序,直接返回。
  • 计算中间位置mid,将数组一分为二。
  • 递归地对左半部分和右半部分进行归并排序。
  • 合并两个有序的子数组,得到一个有序的数组。

非递归实现的思想与递归相似,但实现方式略有不同。它通常从单个元素的组开始,逐步扩大为2个元素、4个元素的组(二倍数扩大组数),然后依次合并这些组,直到整个数组有序。

def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left_half = merge_sort(arr[:mid])right_half = merge_sort(arr[mid:])return merge(left_half, right_half)def merge(left, right):sorted_arr = []i = j = 0while i < len(left) and j < len(right):if left[i] < right[j]:sorted_arr.append(left[i])i += 1else:sorted_arr.append(right[j])j += 1sorted_arr.extend(left[i:])sorted_arr.extend(right[j:])return sorted_arr# 示例
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Sorted array using Merge Sort:", sorted_arr)

2.快速排序

算法思想:

快速排序的核心思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序类似于二叉树的前序遍历,首先选择一个基准值(key),然后不断划分区间,对区间内的元素进行排序,直到整个序列有序。

具体实现:

快速排序的具体实现通常包括以下几个步骤:

  • 选择一个基准元素(pivot),可以选择数组的第一个元素、最后一个元素、中间元素或随机选择的一个元素。
  • 进行分区操作,重新排列数组,使得所有比基准元素小的元素都移动到基准的前面,所有比基准元素大的元素都移动到基准的后面(相同的数可以到任何一边)。
  • 递归地对基准左侧和右侧的子数组进行快速排序。
def quick_sort(arr):if len(arr) <= 1:return arrpivot = 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)# 或者使用原地快速排序(in-place quick sort)
def quick_sort_inplace(arr, low, high):if low < high:pi = partition(arr, low, high)quick_sort_inplace(arr, low, pi - 1)quick_sort_inplace(arr, pi + 1, high)def partition(arr, low, high):pivot = arr[high]  # 选择最后一个元素作为基准i = low - 1  # 较小元素的索引for j in range(low, high):if arr[j] <= pivot:i += 1arr[i], arr[j] = arr[j], arr[i]  # 交换arr[i + 1], arr[high] = arr[high], arr[i + 1]  # 将基准元素放到正确位置return i + 1# 示例(使用原地快速排序)
arr = [10, 7, 8, 9, 1, 5]
quick_sort_inplace(arr, 0, len(arr) - 1)
print("Sorted array using Quick Sort (in-place):", arr)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Surfaceflinger显示图层合成方式

Android SurfaceFlinger是Android系统中负责窗口管理和图像合成的核心组件。它接收来自不同应用的图层数据&#xff0c;并将这些图层合并成一个单一的图像&#xff0c;然后输出到显示设备上。SurfaceFlinger的合成方式主要涉及两种&#xff1a;Client合成和Device合成。 adb s…

wsl安装

一. wsl简介 1. wsl和wsl2的区别 wsl需要把linux命令翻译为windows命令&#xff0c;性能差一些。 wsl2直接使用linux内核&#xff0c;不需要翻译&#xff0c;性能好&#xff0c;但开销相对大一点&#xff0c;因为需要多运行一个hyper-v虚拟机 (并非完整的虚拟机&#xff0c;是…

任务通知的本质(任务通知车辆运行) 软件定时器的本质(增加游戏音效)

任务通知的本质 没有任务通知 所谓"任务通知"&#xff0c;你可以反过来读"通知任务"。 我们使用队列、信号量、事件组等等方法时&#xff0c;并不知道对方是谁。使用任务通知时&#xff0c;可 以明确指定&#xff1a;通知哪个任务。 使用队列、信号量、…

Kubernetes的pod控制器

文章目录 一&#xff0c;什么是pod控制器二&#xff0c;pod控制器类型&#xff08;重点&#xff09;1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Job6.Cronjob 三&#xff0c;pod与控制器的关系1.Deployment2.SatefulSet2.1StatefulSet组成2.2headless的由来2.3有状态服…

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

知识中台在多语言客户中的应用

在全球化的商业环境中&#xff0c;企业面临着多语言客户服务的挑战。HelpLook知识中台作为一种智能化解决方案&#xff0c;为企业提供了一个强大的工具&#xff0c;以实现多语言客户服务的自动化和优化。 一、多语言客户服务的重要性 多语言客户服务对于跨国企业至关重要&…

使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变

作者&#xff1a;来自 Elastic Greg Crist Elasticsearch 推出了一项新功能&#xff1a;Elastic AI Assistant for Search。你可以将其视为 Elasticsearch 和 Kibana 开发人员的内置指南&#xff0c;旨在回答问题、引导你了解功能并让你的生活更轻松。在 Microsoft AI Services…

【K8S问题系列 |18 】如何解决 imagePullSecrets配置正确,但docker pull仍然失败问题

如果 imagePullSecrets 配置正确&#xff0c;但在执行 docker pull 命令时仍然失败&#xff0c;可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录&#xff1a; 1.1 直接登录…

Redis的特性ubuntu进行安装

文章目录 1.六大特性1.1内存存储数据1.2可编程1.3可扩展1.4持久化1.5集群1.6高可用1.7速度快 2.具体应用场景&#xff08;了解&#xff09;3.Ubuntu安装Redis3.1安装指令3.2查看状态3.3查找配置文件3.4修改文件内容3.5重启服务器生效3.6安装客户端并进行检查 4.Redis客户端介绍…

【ASE】第八课_冰(ice)的效果

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习一个简单的冰的效果&#xff0c;这个是根据油管上的视频制作的 可在我的资源里下载模型&#xff0c;贴图&#xff0c;材质 思路 1.物体表面结冰的效果&#xff0c;也就是…

回溯法基础入门解析

回溯法 前 言 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。回溯法&#xff0c;一般可以解决如下几种问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一…

Redis原理及应用

Redis简介 Redis是开源的&#xff08;BSD许可&#xff09;&#xff0c;数据结构存储于内存中&#xff0c;被用来作为数据库&#xff0c;缓存和消息代理。它支持多种数据结构&#xff0c;例如&#xff1a;字符串&#xff08;string&#xff09;&#xff0c;哈希&#xff08;hash…

Ubuntu ESP32开发环境搭建

文章目录 ESP32开发环境搭建安装ESP-IDF搭建一个最小工程现象 ESP32开发环境搭建 最近有个小项目需要用到能够联网的mcu驱动&#xff0c;准备玩玩esp的芯片&#xff0c;记录下ESP32开发环境搭建的过程。 ESP-IDF 是乐鑫科技为其 ESP32 系列芯片提供的官方开发框架。这个框架主…

【C#设计模式(14)——责任链模式( Chain-of-responsibility Pattern)】

前言 责任链模式通过将请求和处理者解耦&#xff0c;关联多个处理者形成一个链条&#xff0c;使每个处理者都有机会处理请求&#xff0c;避免了将所有处理逻辑集中在一个对象中的复杂性。 代码 //请求者 public class Requestor {private string content;public string Cont…

用python将一个扫描pdf文件改成二值图片组成的pdf文件

使用墨水屏读书现在似乎越来越流行&#xff0c;这确实有一定的好处&#xff0c;例如基本不发热&#xff0c;电池续航时间超长&#xff0c;基本不能游戏所以有利于沉浸式阅读&#xff0c;还有不知道是不是真的有用的所谓防蓝光伤害。但是&#xff0c;如果阅读的书籍是扫描图片组…

vue3封装Element Plus table表格组件

支持绝大部分Element Plus原有设置属性&#xff0c;支持分页&#xff0c;支持动态适配高度 效果展示 组件代码&#xff1a; <template><div class"table-wrap" ref"tableWrap"><el-tableclass"w100 h100":data"tableInfo.…

IText创建加盖公章的pdf文件并生成压缩文件

第一、前言 此前已在文章&#xff1a;Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧&#xff0c;本篇以一个案例为基础&#xff0c;主要介绍IText根据pdf模板填充生成pdf文件&#xff0c;并生成压缩文件。 第二、案例 以下面pdf模板为例&#xff0c;生成一个p…

组会 | 大语言模型 + LoRA

目录 1 大语言模型概述1.1 模型的架构1.2 模型的细节&#xff1a;标记化和嵌入化1.3 模型的核心 2 多头注意力机制3 LoRA 概述3.1 冻结部分模型参数3.2 低秩适配&#xff08;LoRA&#xff09;3.2.1 核心工作原理&#xff1a;冻结模型参数3.2.2 核心工作原理&#xff…

对象:是什么,使用,遍历对象,内置对象

对象使用&#xff1a; 对象访问&#xff1a;&#xff08;对象每个属性之间用逗号隔开&#xff09; 补充&#xff1a;也可以通过 对象名[‘属性名’] 对象方法&#xff1a; 方法名:匿名函数 调用方法不需要控制台打印&#xff0c;只要调用就自动输出值 遍历对象&#xff1a; …

小程序24-滚动效果:scroll-view组件详解

在微信小程序中如果想实现内容滚动&#xff0c;需要使用 scroll-view 组件 scroll-view&#xff1a;可滚动视图区域&#xff0c;适用于需要滚动展示内容的场景&#xff0c;用户可以通过手指滑动或者点击滚动条滚动内容。 scroll-x允许横向滚动scroll-y允许纵向滚动 实现横向…