当前位置: 首页 > news >正文

Scala实现常用排序算法

下面我将用 Scala 实现几种常用的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。这些实现将充分利用 Scala 的函数式编程特性,如不可变数据结构和高阶函数。

object SortingAlgorithms {def main(args: Array[String]): Unit = {val numbers = List(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)println(s"原始列表: $numbers")println(s"冒泡排序: ${bubbleSort(numbers)}")println(s"选择排序: ${selectionSort(numbers)}")println(s"插入排序: ${insertionSort(numbers)}")println(s"快速排序: ${quickSort(numbers)}")println(s"归并排序: ${mergeSort(numbers)}")}// 冒泡排序def bubbleSort(list: List[Int]): List[Int] = {def bubblePass(lst: List[Int]): List[Int] = lst match {case a :: b :: rest if a > b => b :: bubblePass(a :: rest)case a :: b :: rest => a :: bubblePass(b :: rest)case single => single}def sortHelper(lst: List[Int], n: Int): List[Int] = if (n == 0) lst else sortHelper(bubblePass(lst), n - 1)sortHelper(list, list.length)}// 选择排序def selectionSort(list: List[Int]): List[Int] = list match {case Nil => Nilcase _ =>val min = list.minval (before, after) = list.span(_ != min)min :: selectionSort(before ++ after.tail)}// 插入排序def insertionSort(list: List[Int]): List[Int] = {def insert(element: Int, sortedList: List[Int]): List[Int] = sortedList match {case Nil => List(element)case head :: tail if element <= head => element :: sortedListcase head :: tail => head :: insert(element, tail)}list.foldLeft(List.empty[Int])((acc, elem) => insert(elem, acc))}// 快速排序def quickSort(list: List[Int]): List[Int] = list match {case Nil => Nilcase pivot :: tail =>val (less, greater) = tail.partition(_ <= pivot)quickSort(less) ++ (pivot :: quickSort(greater))}// 归并排序def mergeSort(list: List[Int]): List[Int] = {def merge(left: List[Int], right: List[Int]): List[Int] = (left, right) match {case (Nil, _) => rightcase (_, Nil) => leftcase (lHead :: lTail, rHead :: rTail) =>if (lHead <= rHead) lHead :: merge(lTail, right)else rHead :: merge(left, rTail)}val mid = list.length / 2if (mid == 0) listelse {val (left, right) = list.splitAt(mid)merge(mergeSort(left), mergeSort(right))}}
}

这些排序算法的实现特点如下:

  1. 冒泡排序:通过多次遍历列表,每次比较相邻元素并交换位置,将最大元素"冒泡"到末尾。实现中使用了辅助函数bubblePass处理单次遍历。

  2. 选择排序:每次找出列表中的最小元素,将其放在已排序部分的末尾,然后对剩余元素重复这一过程。

  3. 插入排序:构建有序列表,对于每个新元素,将其插入到有序列表的适当位置。这里使用了foldLeft函数式风格实现。

  4. 快速排序:选择一个基准元素,将列表分为小于等于基准和大于基准的两部分,然后递归排序这两部分并合并结果。使用partition方法使代码更加简洁。

  5. 归并排序:采用分治法,将列表分为两半,分别排序后再合并两个有序列表。merge函数负责合并两个有序列表。

所有实现都使用了 Scala 的不可变List数据结构,符合函数式编程的思想,避免了副作用。每种算法都有其适用场景,例如快速排序通常性能较好,而归并排序则是稳定排序。

http://www.dtcms.com/a/306672.html

相关文章:

  • 深入理解 Kotlin Flow:异步数据流处理的艺术
  • MidJourney精选图集与提示词生成器:AI创意灵感与高效提示词工具
  • composer 常用命令
  • 高防CDN与高防IP的选择
  • docker可视化管理工具lazydocker
  • 【百卷编程】Go语言大厂高级面试题集
  • 3GPP TS 38.331 V18.6.0 (2025-06)中文版
  • 工业5G路由器赋能高速公路实时监控
  • 【问题未解决-寻求帮助】VS Code 中使用 Conda 环境,运行 Python 后 PowerShell 终端输出内容立即消失
  • 《Java 程序设计》第 12 章 - 异常处理
  • T113-i Linux系统完整构建指南:从SDK开箱到内核镜像量产烧录全流程
  • 2025年湖北中级注册安全工程师报考那些事
  • docker 用于将镜像打包为 tar 文件
  • 【MySQL学习|黑马笔记|Day3】多表查询(多表关系、内连接、外连接、自连接、联合查询、子查询),事务(简介、操作、四大体系、并发事务问题、事务隔离级别)
  • 【公有云部署模型】yolo模型公有云部署
  • 用聊天方式聊聊msvcr100.dll丢失的解决方法有哪些?msvcr100.dll是什么
  • 7.pcl滤波(一)
  • Python在Web开发领域的崛起与生态探索:从脚本语言到全栈利器
  • Unity Standard Shader 解析(四)之ForwardAdd(简化版)
  • 机器视觉halcon7-缺陷检测
  • SpringCloud -- MQ高级
  • 关于获取某目录及子目录下所有文件且不包含隐藏文件
  • dify + mcp 实现图片 ocr 识别
  • Apache RocketMQ 的核心概念(Core Concepts)
  • 解决 Node.js 托管 React 静态资源的跨域问题
  • SpringBoot之整合SSM步骤
  • 基因组选择育种-2.3多性状与多组学整合GS-GWAS
  • Python 使用pandas库实现Excel字典码表对照自动化处理
  • 从单体到分布式:解锁架构进化密码
  • MS Access 数据库修复:修复损坏的 MDB 文件的快速指南