做ppt赚钱的网站重庆建设工程信息网官网入口查询

张小明 2026/1/17 9:09:51
做ppt赚钱的网站,重庆建设工程信息网官网入口查询,有什么网站图片可以做图片合成,咸阳做网站哪家好在 Rust 中实现算法不仅是为了学习排序逻辑#xff0c;更是为了深入理解 Rust 的内存安全和所有权机制。今天#xff0c;我将带大家通过实现一个经典的**快速排序#xff08;Quick Sort#xff09;**算法#xff0c;来探讨 Rust 中的泛型编程、边界安全处理以及性能优化技…在 Rust 中实现算法不仅是为了学习排序逻辑更是为了深入理解 Rust 的内存安全和所有权机制。今天我将带大家通过实现一个经典的**快速排序Quick Sort**算法来探讨 Rust 中的泛型编程、边界安全处理以及性能优化技巧。本文实现的快速排序包含了三数取中法选取基准值能够有效避免在有序数组上的性能退化。核心算法思想快速排序是一种基于分治法Divide and Conquer的排序算法。它的核心步骤分为三步分解Partition从数组中选择一个元素作为基准Pivot将所有小于基准的元素移到其左边大于基准的元素移到其右边。递归Recursion对基准左边和右边的子数组递归地执行快速排序。合并Combine当递归结束时数组自然就有序了无需额外合并操作。为了提升性能我们采用了三数取中法Median-of-three来选择基准这能极大降低遇到最坏情况O(n2)O(n^2)O(n2)的概率。完整代码实现以下是完整的 Rust 代码实现。如果你赶时间可以直接复制这段代码运行。////// Rust 语言的常用算法////// 快速排序主函数////// # 参数/// * arr - 需要排序的可变切片引用////// # 泛型约束/// * T: Ord - T 必须实现可排序和克隆 trait////// # 示例/// /// let mut arr vec![3, 1, 4, 1, 5];/// quick_sort(mut arr);/// assert_eq!(arr, vec![1, 1, 3, 4, 5]);/// pubfnquick_sortT:Ord(arr:mut[T]){// 调用实际的快速排序实现初始左右边界为整个数组范围quick_sort_impl(arr,0,arr.len()-1);}/// 快速排序递归实现函数////// # 参数/// * arr - 需要排序的可变切片引用/// * left - 当前排序范围的左边界包含/// * right - 当前排序范围的右边界包含////// # 泛型约束/// * T: Ord - T 必须实现可排序fnquick_sort_implT:Ord(arr:mut[T],left:usize,right:usize){// 递归终止条件当左边界大于等于右边界时停止排序ifleftright{return;}// 对当前范围进行分区操作返回基准元素的最终位置letpivotpartition(arr,left,right);// 递归排序基准元素左侧的部分注意防止 usize 下溢ifletSome(prev)pivot.checked_sub(1){ifleftprev{quick_sort_impl(arr,left,prev);}}// 递归排序基准元素右侧的部分quick_sort_impl(arr,pivot1,right);}/// 三数取中法选择基准元素/// 通过比较左、中、右三个位置的元素将中位数放到中间位置////// # 参数/// * arr - 数组切片/// * left - 左边界/// * right - 右边界////// # 返回值/// 返回中位数元素的索引////// # 泛型约束/// * T: Ord - T 必须实现可排序fnget_midT:Ord(arr:mut[T],left:usize,right:usize)-usize{// 计算中间位置索引letmid(leftright)/2;// 确保 arr[left] arr[mid] arr[right]// 如果左边元素大于中间元素则交换ifarr[left]arr[mid]{arr.swap(left,mid);}// 如果左边元素大于右边元素则交换ifarr[left]arr[right]{arr.swap(left,right);}// 如果中间元素大于右边元素则交换ifarr[mid]arr[right]{arr.swap(mid,right);}// 返回中位数的索引mid}/// 分区函数将数组分为小于基准和大于基准的两部分////// # 参数/// * arr - 需要分区的数组切片/// * left - 分区范围的左边界/// * right - 分区范围的右边界////// # 返回值/// 基准元素在分区后的最终位置索引////// # 泛型约束/// * T: Ord - T 必须实现可排序fnpartitionT:Ord(arr:mut[T],left:usize,right:usize)-usize{// 使用三数取中法获取基准元素的索引letmid_indexget_mid(arr,left,right);// 将基准元素交换到最左边方便处理arr.swap(left,mid_index);// 初始化左右指针letmutileft1;letmutjright;loop{// 从左边找到第一个大于等于pivot的元素whileijarr[i]arr[left]{i1;}// 从右边找到第一个小于pivot的元素whileijarr[j]arr[left]{j-1;}// 如果指针相遇则结束分区ifij{break;}// 交换元素arr.swap(i,j);i1;j-1;}// 将基准元素放到正确的位置arr.swap(left,j);// 返回基准元素的最终位置j}#[cfg(test)]modtests{usesuper::*;#[test]fntest_quick_sort(){letmutarrvec![3,1,4,1,5];quick_sort(mutarr);assert_eq!(arr,vec![1,1,3,4,5]);}}代码核心亮点解析1. 泛型约束与克隆优化pubfnquick_sortT:Ord(arr:mut[T])Ord: 确保类型可以比较大小这是排序的前提。2. 防御性编程checked_sub这是 Rust 特有的安全处理技巧。在快速排序中我们需要对基准左边的区间[left, pivot-1]进行递归。如果pivot是0那么pivot - 1会导致usize下溢Underflow。在 C/C 中这会导致未定义行为或数据损坏。在 Rust 中Debug 模式会 panicRelease 模式会回绕成一个极大值。我们使用pivot.checked_sub(1)来安全地处理这个问题ifletSome(prev)pivot.checked_sub(1){quick_sort_impl(arr,left,prev);}如果pivot为0checked_sub(1)会返回None从而跳过左侧的递归保证了程序的健壮性。3. 三数取中法Median-of-threefnget_midT:Ord(arr:mut[T],left:usize,right:usize)-usize为了避免在已经有序的数组上性能退化为O(n2)O(n^2)O(n2)我们不盲目选择第一个或最后一个元素作为基准而是取最左、最右、中间三个元素将其中位数放到left位置作为基准。这能显著提高算法在实际数据中的平均性能。4. 双指针碰撞Hoare Partitionpartition函数使用了 Hoare 的原始分区方案指针i从左往右找比基准大的。指针j从右往左找比基准小的。一旦找到就交换两者。这种方案在处理包含大量重复元素的数组时效率通常高于单向扫描的 Lomuto 方案。性能与复杂度分析指标描述平均时间复杂度O(nlog⁡n)O(n \log n)O(nlogn)最坏时间复杂度O(n2)O(n^2)O(n2)(虽然三数取中大大降低了这种概率)空间复杂度O(log⁡n)O(\log n)O(logn)(递归调用栈的深度)稳定性不稳定(相同元素的相对位置可能发生改变)测试与验证我们在代码中附带了一个简单的单元测试。你可以通过cargo test命令来验证算法的正确性。#[test]fntest_quick_sort(){letmutarrvec![3,1,4,1,5];quick_sort(mutarr);assert_eq!(arr,vec![1,1,3,4,5]);}总结通过这个实现我们不仅复习了快速排序的经典逻辑还学习了如何在 Rust 中使用checked_sub处理无符号整数的边界安全。利用泛型T: Ord Clone编写通用的容器算法。通过三数取中法优化算法性能。注在实际生产环境中建议直接使用标准库的arr.sort()或arr.sort_unstable()它们经过了极致的汇编优化。手写此算法主要用于学习和特定需要自定义排序逻辑的场景。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

重庆渝云建设有限公司官方网站网站开发是指

Linly-Talker在儿童早教机器人中的应用尝试 在一间幼儿园的角落,一个孩子踮着脚对着屏幕里的“老师”轻声提问:“小兔子为什么耳朵那么长?”几乎立刻,画面上那位笑容温柔、声音亲切的数字人微微歪头,眨了眨眼&#xff…

张小明 2026/1/10 16:51:48 网站建设

云南网站制作报价西安企业网站建设价格

三维场景中如何实现交互 一、介绍 MapGIS Objects SDK : 是一款组件式地理信息开发平台,提供全空间数据存储、管理、显示、编辑、查询、分析、制图输出等二三维一体化核心 GIS 功能,提供 C、.NET、Java、Python 等开发资源,接口…

张小明 2026/1/10 16:51:49 网站建设

网站怎么做才吸引人网络营销有什么岗位

AI填色工具终极指南:如何将普通照片变成艺术填色画 【免费下载链接】paintbynumbersgenerator Paint by numbers generator 项目地址: https://gitcode.com/gh_mirrors/pa/paintbynumbersgenerator 在数字艺术创作的世界里,AI填色工具正成为越来越…

张小明 2026/1/16 6:51:13 网站建设

怎样给一个网站做专题策划网站备案注销流程

家人们,现在学校查得是真严,不仅重复率,还得降ai率,学校规定必须得20%以下... 折腾了半个月,终于把市面上各类方法试了个遍,坑踩了不少,智商税也交了。今天这就把这份十大降AI工具合集掏心窝子…

张小明 2026/1/10 16:51:52 网站建设

网站建站网站看看保山市城市建设网站

常用工具库与程序介绍 在计算机系统中,有许多工具库和程序对于系统的正常运行和管理起着至关重要的作用。下面将为大家详细介绍一些常见的工具库和程序,包括它们的功能、安装依赖以及官方下载地址等信息。 1. Ncurses相关库 Ncurses是一个用于在终端中实现图形界面的库,其…

张小明 2026/1/10 16:51:53 网站建设

做网站最好的公司有哪些能看所有网站的浏览器

轻松上手Noi浏览器:完美整合豆包AI的全方位使用指南 【免费下载链接】Noi 项目地址: https://gitcode.com/GitHub_Trending/no/Noi 还在为AI助手切换频繁而烦恼吗?Noi浏览器通过智能扩展机制,让豆包AI(Doubao)…

张小明 2026/1/10 16:51:54 网站建设