【常用算法:排序篇】7.算法魔法与面试秘籍:从趣味排序到实战通关

news2025/7/18 15:15:01

在这里插入图片描述

一、趣味排序算法:突破常规的思维火花

1. 睡眠排序(Sleep Sort)—— 时间维度的魔法

  • 核心思想:利用多线程休眠时间模拟数值大小,自然输出有序结果。
  • Python示例
    import threading
    import time
    
    def sleep_sort(arr):
        sorted_list = []
        def worker(num):
            time.sleep(num * 0.1)
            sorted_list.append(num)
        
        threads = []
        for num in arr:
            thread = threading.Thread(target=worker, args=(num,))
            thread.start()
            threads.append(thread)
        
        for thread in threads:
            thread.join()
        
        return sorted_list
    
  • 特点:时间复杂度 O(max(arr)),无法处理负数,但启发并发思维。

2. 猴子排序(Bogo Sort)—— 随机性的狂欢

  • 核心思想:随机打乱数组直到有序,验证“无限猴子定理”。
  • Python实现
    import random
    
    def bogo_sort(arr):
        while not all(arr[i] <= arr[i+1] for i in range(len(arr)-1)):
            random.shuffle(arr)
        return arr
    
  • 时间复杂度:平均 O(n×n!),最坏情况无限。

3. 珠排序(Bead Sort)—— 物理世界的计算艺术

  • 核心思想:模拟珠子重力下落实现排序。
  • Python实现
    def bead_sort(arr):
        max_val = max(arr)
        beads = [[0]*max_val for _ in arr]
        for i, num in enumerate(arr):
            beads[i][:num] = [1]*num
        
        # 模拟下落(略)
        return [sum(col) for col in zip(*beads)]
    
  • 适用场景:正整数排序,硬件友好。

4. 计数排序 & 基数排序—— 数据特性的降维打击

  • 计数排序:适用于小范围整数,时间复杂度 O(n + k)
    def counting_sort(arr, max_val):
        count = [0] * (max_val + 1)
        for num in arr:
            count[num] += 1
        return [i for i in range(max_val+1) for _ in range(count[i])]
    
  • 基数排序:分位处理,稳定排序。
    示例:56 → 54 → 按十位排序 → 最终有序
    

二、经典排序面试题:实战思维解析

1. C++ Sort函数进阶用法

  • 自定义排序规则
    bool comp(int a, int b) { return a > b; }
    std::sort(arr.begin(), arr.end(), comp);
    
  • 动态数组排序
    std::vector<int> vec = {5, 3, 1};
    std::sort(vec.begin(), vec.end());
    

2. 高频面试题精讲

2-Sum问题:双指针法
vector<int> twoSum(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int sum = nums[left] + nums[right];
        if (sum == target) return {left, right};
        else if (sum < target) left++;
        else right--;
    }
    return {};
}
  • 关联杨氏矩阵:双指针等效于二维搜索。
合并K个有序链表:最小堆优化
import heapq
def merge_k_lists(lists):
    heap = []
    for i, node in enumerate(lists):
        if node: heapq.heappush(heap, (node.val, i, node))
    # 合并逻辑(略)
荷兰国旗问题:三指针法
def sortColors(nums):
    p0, curr, p2 = 0, 0, len(nums)-1
    while curr <= p2:
        if nums[curr] == 0:
            nums[p0], nums[curr] = nums[curr], nums[p0]
            p0 += 1
            curr += 1
        elif nums[curr] == 2:
            nums[curr], nums[p2] = nums[p2], nums[curr]
            p2 -= 1
        else:
            curr += 1

3. 排序算法选择策略

场景推荐算法原因
内存受限堆排序原地排序,空间复杂度O(1)
几乎有序数据插入排序时间复杂度接近O(n)
海量数据外部排序归并排序分块处理,稳定
大量重复元素三向切分快速排序减少冗余比较

三、核心思维总结

  1. 特性破局:根据数据特点选择算法(如计数排序针对小范围整数)。
  2. 思维跃迁:将时间、空间、物理现象转化为计算资源(如睡眠排序、珠排序)。
  3. 实战优化:双指针、堆、分治等模式化解题套路。
  4. 工程思维:在内存、稳定性、效率间权衡(如外部排序)。

🚀 一句话记住

“算法是魔法与逻辑的交织——用趣味点燃思维,用实战征服挑战!”

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

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

相关文章

Android | IOS — Solox性能测试

文章目录 Solox性能测试1. 前置条件2. 软件图片 Solox性能测试 1. 前置条件 安装Python:3.10.0以上版本&#xff1a; Windows&#xff1a;Python官网 安装 SoloX python -m solox2. 软件图片 软件图片 报告分析&#xff1a;

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】

引言 在人工智能图像生成领域&#xff0c;Midjourney 凭借其强大的艺术表现力和灵活的创作模式&#xff0c;已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”&#xff0c;我将结合多年实战经验&#xff0c;系统分享 Midjourney 的创作方法论&#x…

工具篇-扣子空间MCP,一键做游戏,一键成曲

一、登陆扣子空间 地址如下&#xff1a; 扣子空间 打开&#xff0c;然后登陆扣子 登陆之后快速开始&#xff1a; 二、生成游戏 小试牛刀&#xff0c;我们让它做一个打地鼠的游戏&#xff1a; 已经开始设计制作&#xff1a; 制作完成&#xff1a; 三、制作音乐 新…

5.6 - 5.9 MySQL

数据库&#xff1a;存储和管理数据的仓库DB。 数据库管理系统&#xff1a;操纵和管理数据库的大型软件DBMS。 关系型数据库 一个数据库内可以创建多张表&#xff0c;在一个表内能存放多个数据。 SQL语句&#xff1a; DDL&#xff1a; 存储字符串用varchar。&#xff08;类似于…

C# WinForm 如何高效地将大量数据从 CSV 文件导入 DataGridView

如果你有非常多的csv文件&#xff0c;每个文件包含N多行与M多列&#xff0c;如&#xff1a;18000 行和 27 列。现在&#xff0c;想制作一个 Windows 窗体应用程序&#xff0c;导入它们并在 datagridview 中显示&#xff0c;然后进行一些数学运算。可是&#xff0c;发现数据导入…

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境&#xff1a;SQLPub。它提供了最新版本的 MySQL 服务器测试服务&#xff0c;可以方便开发者和测试人员验证数据库功能&#xff0c;也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址&#xff1a; https://sqlpub.com/ SQLP…

URP相机如何将场景渲染定帧模糊绘制

1&#xff09;URP相机如何将场景渲染定帧模糊绘制 2&#xff09;为什么Virtual Machine会随着游戏时间变大 3&#xff09;出海项目&#xff0c;打包时需要勾选ARMv7吗 4&#xff09;Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送&#xff0c;精选了UWA社…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC &#xff08;BarneyICC&#xff09; https://wago.io/BarneyICC/69 全量英文字符串&#xff1a; !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

FramePack - 开源 AI 视频生成工具

&#x1f3ac; 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库&#xff0c;专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现&#xff0c;能够显著提升动画资源的处理效率。 此 AI 视频生成项目&#xff0c;旨在通过低显…

Vuetify框架使用(一)之v-snackbar 组件封装及全局使用

说明&#xff1a;v-snackbar 组件适用于统一管理消息提示框(操作反馈的提示) 看效果&#xff1a; 1、在状态管理中创建文件&#xff0c;统一管理 // stores/snackbar.js /*** 统一管理消息提示框(操作反馈的提示)*/import { defineStore } from pinia; // 消息类型 export co…

FPGA: UltraScale+ bitslip实现(方案+代码)

收获 一晃五年~ 五年前那个夏夜&#xff0c;我对着泛蓝的屏幕敲下《给十年后的自己》&#xff0c;在2020年的疫情迷雾中编织着对未来的想象。此刻回望&#xff0c;第四届集创赛的参赛编号仍清晰如昨&#xff0c;而那个在家熬夜焊电路板的"不眠者"&#xff0c;现在…

【SpeechLMs】语音大型语言模型综述《A Survey on Speech Large Language Models》

摘要 大型语言模型 (LLM) 表现出强大的上下文理解能力和显著的多任务性能。 因此&#xff0c;研究人员一直在寻求将 LLM 整合到更广泛的语音语言理解 (SLU) 领域。 与传统方法不同&#xff0c;传统方法是将 LLM 级联以处理自动语音识别 (ASR) 生成的文本&#xff0c;而新方法则…

吴恩达机器学习笔记:特征与多项式回归

1.特征和多项式回归 如房价预测问题&#xff0c; ℎθ (x) θ0 θ1 frontage θ2 deptℎ x1 frontage&#xff08;临街宽度&#xff09;&#xff0c;x2 deptℎ&#xff08;纵向深度&#xff09;&#xff0c;x frontage ∗ deptℎ area &#xff08;面积&#xff09;…

LangChain4j正式发布-简化将 LLM 集成到 Java 应用程序过程

LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 官网地址 源码地址 开源协议&#xff1a;Apache License 2.0 实现方法 统一 API&#xff1a;LLM 提供程序&#xff08;如 OpenAI 或 Google Vertex AI&#xff09;和嵌入&#xff08;矢量&#xff09;存储…

【C++】汇编角度分析栈攻击

栈攻击 介绍原理示例代码汇编分析 介绍原理 核心原理是通过 缓冲区溢出&#xff08;Buffer Overflow&#xff09; 等漏洞&#xff0c;覆盖栈上的关键数据&#xff08;如返回地址、函数指针&#xff09;&#xff0c;从而改变程序执行流程&#xff1b; 在 C 中&#xff0c;每个…

Vue 3 打开 el-dialog 时使 el-input 获取焦点

运行代码&#xff1a;https://andi.cn/page/622178.html 效果&#xff1a;

C++23 views::repeat (P2474R2) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::repeat概述基本概念原型定义工作原理应用场景初始化容器模拟测试数据 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特性&#xff0c;这些特性不仅提升了语言的性能和表达…

OpenCv高阶(4.0)——案例:海报的透视变换

文章目录 前言一、工具函数模块1.1 图像显示函数1.2 保持宽高比的缩放函数1.3 坐标点排序函数 二、透视变换核心模块2.1 四点透视变换实现 三、主流程技术分解3.1 图像预处理3.2 轮廓检测流程3.3 最大轮廓处理 四、后处理技术4.1 透视变换4.2 形态学处理 五、完整代码总结 前言…

光谱相机的图像预处理技术

光谱相机的图像预处理技术旨在消除噪声、增强有效信息&#xff0c;为后续分析提供高质量数据。 一、预处理流程与技术要点 ‌辐射校正‌ ‌辐射定标‌&#xff1a;将图像灰度值转换为绝对辐射亮度&#xff0c;常用反射率法、辐亮度法和辐照度法消除传感器响应差异&#xff0…

k8s监控方案实践补充(一):部署Metrics Server实现kubectl top和HPA支持

k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持 文章目录 k8s监控方案实践补充&#xff08;一&#xff09;&#xff1a;部署Metrics Server实现kubectl top和HPA支持一、Metrics Server简介二、Metrics Server实战部署…