第八十六篇 大数据排序算法:从厨房整理到分布式排序的智慧

目录

      • 一、基础排序算法:生活场景中的计算智慧
        • 1.1 冒泡排序:图书馆的书籍整理
        • 1.2 插入排序:厨房调料的整理艺术
      • 二、高效排序算法:大数据处理的利器
        • 2.1 快速排序:音乐APP的智能歌单
        • 2.2 归并排序:学校成绩单的合并
      • 三、大数据排序实战:算法选择决策图
      • 四、技术思考:排序算法的哲学启示

在大数据时代,排序是数据处理的基石。如同整理厨房调料能让烹饪效率翻倍,优秀排序算法能让TB级数据瞬间归位。


一、基础排序算法:生活场景中的计算智慧

1.1 冒泡排序:图书馆的书籍整理
  • 算法原理:相邻元素两两比较,较大值逐步"上浮"。
  • 时间复杂度:O(n²)
  • 生活映射
    • 场景:整理图书馆书架上的乱序书籍
    • 操作步骤:
      1. 从书架左端开始,比较相邻两本书的编号
      2. 若左边编号大于右边,则交换位置
      3. 每轮遍历使最大编号移到最右端
      4. 重复直到全部有序
  • 代码实现
def bubble_sort(books):n = len(books)for i in range(n-1):for j in range(0, n-i-1):if books[j] > books[j+1]:books[j], books[j+1] = books[j+1], books[j]  # 交换位置# 测试:整理书架上的书籍编号
book_ids = [587, 102, 423, 256, 931]
bubble_sort(book_ids)
print(book_ids)  # 输出 [102, 256, 423, 587, 931]
1.2 插入排序:厨房调料的整理艺术
  • 算法核心:将未排序元素插入已排序序列的合适位置。
  • 时间复杂度:O(n²)
  • 生活映射
    • 场景:整理厨房调料架
    • 操作步骤:
      1. 假设盐瓶已放在正确位置(首个元素)
      2. 拿起酱油瓶,与盐瓶比较后插入左侧
      3. 拿起糖罐,与前面调料比较后插入盐瓶和酱油瓶之间
      4. 重复直到所有调料按使用频率排序
  • 代码示例
def insertion_sort(seasonings):for i in range(1, len(seasonings)):key = seasonings[i]  # 当前要插入的调料j = i-1while j >=0 and key < seasonings[j]:seasonings[j+1] = seasonings[j]  # 后移元素j -= 1seasonings[j+1] = key  # 插入正确位置# 使用示例:按使用频率排序(1-5分)
usage_freq = [3, 5, 1, 4, 2]
insertion_sort(usage_freq)
print(usage_freq)  # 输出 [1, 2, 3, 4, 5]

二、高效排序算法:大数据处理的利器

2.1 快速排序:音乐APP的智能歌单
  • 核心思想:分治法 + 基准值分区
  • 时间复杂度:平均O(n log n)
  • 生活映射:音乐APP的歌单分类
    • 场景:将1000首随机歌曲按流派分组
    • 操作步骤:
      1. 选择基准点(如"流行"流派)
      2. 将歌曲分为"流行"和"非流行"两大分区
      3. 在"非流行"分区选择新基准(如"摇滚")
      4. 递归分区直到所有流派有序
  • 代码实现
def quick_sort(songs, low, high):if low < high:# 分区操作pi = partition(songs, low, high)# 递归排序quick_sort(songs, low, pi-1)quick_sort(songs, pi+1, high)def partition(songs, low, high):pivot = songs[high]['genre']  # 以流派为基准i = low - 1for j in range(low, high):if songs[j]['genre'] <= pivot:i += 1songs[i], songs[j] = songs[j], songs[i]songs[i+1], songs[high] = songs[high], songs[i+1]return i+1# 示例数据结构
songs = [{'title': 'Song1', 'genre': 'Rock'},{'title': 'Song2', 'genre': 'Pop'},{'title': 'Song3', 'genre': 'Jazz'}
]
quick_sort(songs, 0, len(songs)-1)
2.2 归并排序:学校成绩单的合并
  • 核心原理:分治法 + 有序序列合并
  • 时间复杂度:稳定O(n log n)
  • 生活映射:合并多个班级的成绩单
    • 场景:合并3个班级的有序成绩单(每个班1000人)
    • 操作步骤:
      1. 将每班成绩单拆分成单个学生记录
      2. 两两合并小列表:比较两个列表首位学生成绩
      3. 取较小值放入新列表,直到所有列表合并
      4. 递归合并直到完全有序
  • 分布式扩展:MapReduce实现TB级数据排序
def merge_sort(grades):if len(grades) > 1:mid = len(grades)//2L = grades[:mid]  # 左半班级R = grades[mid:]  # 右半班级merge_sort(L)  # 递归排序左半merge_sort(R)  # 递归排序右半# 合并两个有序列表i = j = k = 0while i < len(L) and j < len(R):if L[i] < R[j]:grades[k] = L[i]i += 1else:grades[k] = R[j]j += 1k += 1# 处理剩余元素while i < len(L):grades[k] = L[i]i += 1k += 1while j < len(R):grades[k] = R[j]j += 1k += 1# 测试:合并三个班级的成绩
classA = [75, 80, 92]  # 已排序
classB = [68, 79, 88]  # 已排序
classC = [72, 85, 90]  # 已排序
all_grades = classA + classB + classC
merge_sort(all_grades)
print(all_grades)  # 合并排序结果

三、大数据排序实战:算法选择决策图

graph TDA[数据规模] -->|小于1000| B[基础排序]A -->|大于1000| C{数据特征}B --> D[内存敏感?]D -->|是| E[插入排序]D -->|否| F[冒泡排序/选择排序]C -->|基本有序| G[插入排序]C -->|完全随机| H[快速排序]C -->|需要稳定排序| I[归并排序]A -->|TB级数据| J[分布式归并排序]

四、技术思考:排序算法的哲学启示

  1. 分治智慧:如同管理大型超市,将商品分区(生鲜、日用品)再细分子类,比全局整理更高效
  2. 空间换时间:归并排序需要额外空间,如同厨房准备多个调料盒换取烹饪效率
  3. 场景适配
    • 小规模数据:插入排序如整理钱包钞票
    • 大规模随机数据:快速排序如城市车辆分流
    • 分布式环境:MapReduce实现归并排序

在大数据洪流中,排序算法是数据工程师的"整理术"。掌握从O(n²)到O(n log n)的跨越,本质上是将混沌转化为秩序的艺术——正如把杂乱的书架变成知识的阶梯,让数据洪流成为信息瀑布。

🎯下期预告:《数据算法-枚举》
💬互动话题:凡事留余地,雅量能容人
🏷️温馨提示:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。如果觉得有帮助,点赞关注不迷路🌟

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

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

相关文章

开源 | V3.1.1慧知开源重卡运营充电桩平台 - 重卡运营充电桩平台管理解决方案;企业级完整代码 多租户、模拟器、多运营商、多小程序;

【开源免费版】推荐一套企业级开源充电桩平台&#xff1a;完整代码包含多租户、硬件模拟器、多运营商、多小程序&#xff0c;汽车 电动自行车、云快充协议&#xff1b;——(慧哥)慧知开源充电桩平台&#xff1b;https://liwenhui.blog.csdn.net/article/details/148242725?spm…

ONLYOFFICE 协作空间 企业版使用秘籍-8.使用虚拟数据房间,处理机密文档更安全

在当今快节奏的社会中&#xff0c;信息已成为极其关键的资源&#xff0c;因此&#xff0c;保护敏感数据至关重要。ONLYOFFICE 协作空间中的虚拟数据房间&#xff08;VDR&#xff09;提供了一个安全便捷的工作空间&#xff0c;确保文档受到严密保护的同时&#xff0c;也能实现轻…

系统架构设计师论文分享-论软件架构复用

我的软考历程 摘要 2023年2月&#xff0c;我所在的公司通过了研发纱线MES系统的立项&#xff0c;该项目为国内纱线工厂提供SAAS服务&#xff0c;旨在提升纱线工厂的数字化和智能化水平。我在该项目中担任架构设计师&#xff0c;负责该项目的架构设计工作。本文结合我在该项目…

虚拟主机与独立服务器如何选择

在搭建和维护网站时&#xff0c;选择合适的服务器套餐至关重要。虚拟主机和独立服务器是两种常见的选择&#xff0c;它们各有优缺点&#xff0c;适用于不同需求的用户。本文将深入探讨这两种服务器类型的特点&#xff0c;以帮助您为您的网站选择最合适的服务器解决方案。虚拟主…

NFC的安全技术体系

NFC&#xff08;近场通信&#xff09;技术因广泛应用于移动支付、身份认证、门禁控制等敏感场景&#xff0c;其安全技术体系是保障用户数据与交易安全的核心。该体系涵盖数据传输安全、存储安全、身份认证、防攻击机制等多个维度&#xff0c;通过硬件隔离、加密算法、协议规范等…

Echarts3D柱状图-圆柱体-文字在柱体上垂直显示的实现方法

全部代码 <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>3D柱状图-圆柱体-文字竖排</title> </head> <body style"height: 100%; margin: 0"…

【算法训练营Day08】字符串part2

文章目录 反转字符串里的单词右旋字符串KMP算法双指针法总结 反转字符串里的单词 题目链接&#xff1a;151. 反转字符串中的单词 双指针法解题逻辑 head指针遍历字符串遍历到单词首单词&#xff0c;生成end指针移动到单词尾部遇到完整单词收集&#xff0c;压入栈中head指针移动…

如何使用backtrace定位Linux程序的崩溃位置

在嵌入式Linux开发中&#xff0c;特别是复杂软件&#xff0c;多人协作开发时&#xff0c;当某人无意间写了一个代码bug导致程序崩溃&#xff0c;但又不知道崩溃的具体位置时&#xff0c;单纯靠走读代码&#xff0c;很难快速的定位问题。 本篇就来介绍一种方法&#xff0c;使用…

十大排序算法汇总

好的&#xff0c;下面为你整理一篇面试全覆盖、极其深入的十大排序算法总结博客&#xff0c;涵盖算法原理、复杂度、稳定性、应用场景、工程实践、C与Python实现&#xff08;含详细注释&#xff09;&#xff0c;并对比分析各种排序的优缺点与适用情境。内容力求结构清晰、讲解透…

零基础 “入坑” Java--- 七、数组(二)

文章目录 一、数组转字符串二、数组的拷贝三、求数组中元素的平均值四、查找数组中指定元素&#xff08;顺序查找&#xff09;五、数组排序&#xff08;冒泡排序&#xff09;六、查找数组中指定元素&#xff08;二分查找&#xff09;七、判断两个数组中的元素是否相等八、填充数…

【C++ 真题】P1104 生日

P1104 生日 题目描述 cjf 君想调查学校 OI 组每个同学的生日&#xff0c;并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多&#xff0c;没有时间&#xff0c;所以请你帮她排序。 输入格式 输入共有 n 1 n 1 n1 行&#xff0c; 第 1 1 1 行为 OI 组总人数 n n n&…

Oracle DB和PostgreSQL,OpenGauss主外键一致性的区别

针对于unique索引在主外键上的表现&#xff0c;o和PG的行为确实不一致&#xff0c;测试样例&#xff1a;PG:测试1&#xff1a;test# CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL, globalid VARCHAR(38) DEFAULT {00000000-0000-0000-0000-000000000000} …

06.自动化测试概念

自动化测试概念 1. 自动化1.1 回归测试1.2 自动化分类 1.3 自动化测试金字塔2. web自动化测试3.Selenium 1. 自动化 ​ **自动化测试&#xff08;Automated Testing&#xff09;&#xff1a;**是指使用软件工具或脚本来自动执行测试任务&#xff0c;代替人工进行重复性、繁琐的…

页面登录数据的加密(前端+后端)

本加密过程使用的 AESRSA概要1.使用AES对传输数据进行加密AES为对称加密,加密和解决所需要的key是一样的,所以拦截到AES key就可以直接解密,所以需要结果RSA进行加密2.对AES的key进行RSA加密RSA为非对称加密,客户端只能获取到publicKey(公钥),而解密只能使用服务器的privateKey…

PC端基于SpringBoot架构控制无人机(一):初识无人机控制

一、无人机飞控系统的概述飞控&#xff08;Flight Controller&#xff09;是无人机最为核心的组成部分之一&#xff0c;负责实现无人机的自主飞行控制和稳定飞行。飞控系统的功能决定了无人机的飞行性能&#xff0c;包括飞行的稳定性、操控的响应速度、导航的精确度等。通过飞控…

QT6 源(154)模型视图架构里的列表视图 QListView:先学习属性部分,

&#xff08;1&#xff09;属性总图&#xff0c;以及测试程序的框架 &#xff1a; 开始属性的学习 &#xff1a; &#xff08;2&#xff09; 继续属性学习 &#xff1a; &#xff08;3&#xff09; 谢谢

MySQL——9、事务管理

事务管理 1、什么是事务&#xff1f;2、事务常见操作方式3、事务隔离级别4、数据库并发场景4.1、读-写4.2、RR与RC的本质区别 1、什么是事务&#xff1f; mysql是基于CS模式的&#xff0c;是一套网络服务&#xff0c;所以我们是可以在本地连接上远程服务器的mysql服务端的。my…

Python之面向对象详解(一篇足矣)

目录 一、初阶面向对象 1. 初识面向对象 1.1 对象和self 1.2 常见成员 1.3 应用示例 将数据封装到一个对象&#xff0c;便于以后使用。 将数据封装到对象中&#xff0c;在方法中对原始数据进行加工处理。 根据类创建多个对象&#xff0c;在方法中对对象中的数据进行修改…

【Qt】qml组件对象怎么传递给c++

将QML组件对象传递给C的方法 在QML和C之间传递完整的组件对象需要特殊处理&#xff0c;因为QML组件是动态创建的JavaScript对象。以下是几种有效的方法&#xff1a; 1. 使用QObject指针传递 C端设置 // MyClass.h #include <QObject> #include <QQuickItem>cla…

Java基础 集合框架 List框架

list架构 list接口list 核心特性以及扩展Collection的体现 抽象类 AbstractList抽象类 AbstractSequentialList (简化链表的顺序访问)AbstractSequentialList 核心特点自定义实现示例代码讲解其实现原理AbstractSequentialList 总结与AbstractList的对比 List 实现类 ArrayList…