scala实现快排,归并,冒泡,二分查找

scala实现二分查找(非递归版) 前言:递归确实比较容易理解也比较容易实现,但是效率是真的不敢恭维的,所以,下面的scala实现二分查找是非递归方式!代码也比较容易理解,所以就没有什么注释啦,请见谅哈~ object BinarySearch { def main(args: Array[String]) { //test val arr = Array(1,2,3,4,5,6,7,8,9) pri... 阅读详情

快速排序

思想

快速排序使用分治的思想,选定一个基准点,通过一趟排序将待排序的序列分为左右两个部分,其中左边的部分都比基准点要小,右边的基准点都比基准点要大,之后在分别对左右两边的部分,按照相同的思想继续切分,最终达到一个有序队列的目的

复杂度

时间复杂度:O(nlog(n))
空间复杂度:O(log(n))

scala代码实现

  def quickSort(list: List[Int]): List[Int] = {
    list match {
      case Nil => Nil
      case List() => List()
      case (head :: tail) => {
        val (l, r) = tail.partition(_ < head)
        quickSort(l) ::: head :: quickSort(r)
      }
    }
  }

归并排序

思想

归并排序就是将两个无序的列表合并一个有序列表,通过不断的切分列表知道剩下一个元素,在进行合并,最终形成有序列表

复杂度

时间复杂度:O(nlog(n))
空间复杂度:O(n)

scala代码实现

  def mergedSort[T](less:(T,T)=>Boolean)(list:List[T]):List[T] = {
    def merged(xList: List[T], yList: List[T]): List[T] = {
      (xList,yList) match{
        case (Nil,_) => yList
        case (_,Nil) => xList
        case (x::xTail,y::yTail) =>{
          if(less(x,y)) x::merged(xTail,yList)
          else
            y::merged(xList,yTail)
        }
      }
    }

    val n = list.length/2
    if(n == 0) list
    else {
      val (x,y) = list.splitAt(n)
      merged(mergedSort(less)(x),mergedSort(less)(y))
    }
  }

冒泡排序

思想

冒泡排序是一种交换排序,从无序队列的头部开始,按照指定的排序规则,相邻元素两两比较,满足条件则进行交换位置,达到实现有序队列的目的。

复杂度

时间复杂度:O(n^2)
空间复杂度:O(1)

scala代码实现

  def compute(data: Int, list: List[Int]):List[Int] = {
    list match {
      case List() => List(data)
      case head::tail => if(head < data) head::compute(data,tail) else data::list
    }
  }

  def bubbleSort(list:List[Int]):List[Int] = list match {
    case List() => List()
    case head::tail => compute(head,bubbleSort(tail))
  }

二分查找

思想

二分查找也叫折半查找,实现二分查找是必须建立在已经排好序的数组上,先将要查找的值跟中间值做比较,如果比中间值小,就从左半边的数组继续查找,如果比中间值打就从右半边的数组中查找。

优点

查找次数少,查找速度快,平均性能好

缺点

要求待查找数组必须是已经排好序的列表,且插入删除困难
因此二分查找使用与不经常变动但经常查找的列表

复杂度

时间复杂度:O(log2n)
空间复杂度:O(1)

实现

 def binarySearch2(array: Array[Int], l: Int, r: Int, findVal: Int): ArrayBuffer[Int] = {
    if (r < l) {
      return ArrayBuffer()
    }
    val midIndex = (l + r) / 2
    val midVal = array(midIndex)
    if (midVal > findVal) {
      binarySearch2(array, l, midIndex, findVal)
    } else if (midVal < findVal) {
      binarySearch2(array, midIndex, r, findVal)
    } else {
      println(s"midIndex=${midIndex}")
      val resArr = ArrayBuffer[Int]()
      var temp = midIndex - 1
      Breaks.breakable {
        while (true) {
          if (temp < 0 || array(temp) != findVal) {
            Breaks.break()
          }
          if (array(temp) == findVal) {
            resArr.append(temp)
          }
          temp -= 1
        }
      }
      resArr.append(midIndex)
      temp = midIndex + 1
      Breaks.breakable {
        while (true) {
          if (temp > array.length - 1 || array(temp) != findVal) {
            Breaks.break()
          }
          if (array(temp) == findVal) {
            resArr.append(temp)
          }
          temp += 1
        }
      }
      return resArr
    }

  }
排序算法与函数式编程:不可变数据排序 函数式编程中"不可变性"的核心意义传统排序算法(如快排、冒泡)在不可变场景下的局限性为何归并排序是函数式排序的最佳选择用Scala/Clojure等语言实现不可变排序的实战案例不可变排序在高并发系统中的实际应用价值本文将按照"概念引入→原理分析→代码实战→场景应用"的逻辑展开:首先用生活故事引出不可变排序的需求,接着拆解核心概念(不可变数据、函数式排序),然后通过数学模型和代码示例讲解归并排序的函数式实现,最后结合实际场景说明其价值。不可变数据(Immutable Data) 阅读详情

相关推荐

Apache Flink集成HDFS报错Failed to create checkpoint storage at checkpoint coordinator side.

在网上查询相关资料后,在flink的lib目录添加flink-shaded-hadoop-3-3.1.1.7.0.3.0-79-7.0.jar、commons-cli-1.5.0.jar两个包,但报错依旧存在,添加了export HADOOP_CLASSPATH=后面发现是hadoop与flink的兼容性问题,hadoop原先使用的是3.3.4,与多个版本的flink集成都会出现报错,最后将Hadoop的版本改成3.1.3,使用flink run运行jar包就没有这个错误了,在hdfs上成功保存了检查点。

zywenmag的博客 623

scala实现二分查找(递归)

使用递归实现 1.找到即返回 def binarySearch(array: Array[Int],low:Int,high:Int,findVal:Int): Int ={ if(low<=high){ val mid = low + (high - low)/2 if(array(mid)==findVal) mid else if(findVal<array(mid)) binarySearch(array,low

qq_38748148的博客 339

论文阅读------Exposure Fusion: A Simple and Practical Alternative to High Dynamic Range Photography

Mertens T, Kautz J, Van Reeth F. Exposure fusion: A simple and practical alternative to high dynamic range photography[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing Ltd, 2009, 28(1): 161-171. 摘要 本文提出了一种将包围曝光的序列融合到高质量图像中的技术,而无需先转换为高动态范围(HD.

qq_25283239的博客 3397

在JAVA利用递归实现,二分查找,排序以及解决相关问题

我们不难发现,在多路递归中存在重复计算,比如:当计算到f(7)=f(6)+f(5)时,同时执行f(5)和f(6)的两个递归然后两个递归同时执行的时候会出现值的重复计算,比如:f(5)=f(4)+f(3),f(6)=f(5)+f(4)递归实现会出现爆栈,当结束条件没有执行时,之前的函数调用运算都在一直等待,导致栈内存爆满(如递归相加到15000,就会存在报错)。该代码实现的是多路递归,如:当计算到f(7)=f(6)+f(5)时,同时执行f(5)和f(6)和的两个递归,类似这种的递归方式叫多路递归。

2305_80120642的博客 1060

RI-CLPM vs CLPM:什么时候该用随机截距交叉滞后模型?

本文深入对比了交叉滞后模型(CLPM)与随机截距交叉滞后模型(RI-CLPM)的核心差异与应用场景。RI-CLPM通过分离个体间稳定特质与个体内动态波动,能更纯净地估计变量间的动态因果关系,避免CLPM可能存在的混淆。文章提供了清晰的模型选择决策框架,并辅以Mplus语法示例,帮助研究者根据变量特质稳定性与研究问题,正确选用模型以确保结论的严谨性。

weixin_29276847的博客 304

C++游戏开发实战:从零构建局域网联机对战系统(附完整代码解析)

本文详细介绍了如何使用C++开发局域网联机对战游戏系统,涵盖从环境搭建到实战代码解析的全过程。重点讲解了Winsock库的应用、Socket通信原理、服务端与客户端开发技巧,以及性能优化和安全防护方案,帮助开发者快速掌握C++游戏开发的核心技术。

weixin_42524945的博客 445

Scala编写冒泡,排序,二分法

** * 常见的查找算法 * 1. 冒泡法 * 2. 排序法 * 3. 二分法 */ object FindArithmetic { /** * 冒泡法 * * @param str * @return * 给你 n 个数 ,我们用第一个数和第二个数进行比较 ,大的那个就放第二位 , * 然后第二位和第三位比较 ,大的那个...

java_resolver的博客 423

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

阿里开源语音大模型:语音识别效果和性能强于 Whisper,还能检测掌声、笑声、咳嗽等

u010522887的专栏 4万+

Scala实现快速排序

Scala实现快速排序(算法导论) 相关内容 快速排序C++实现 Leetcode215. Kth Largest Element in an Array(基于快速排序及其划分算法) 算法思路 快速排序基于分治策略,通过划分算法,递归地对左右子序列进行划分,直到划分到长度为1的子序列回溯,经过logn次划分,即可得到有序序列 def quickSort(start : Int, end : Int) : Unit = { if (start < end) { var pivot :

qq_44486439的博客 808

三极管NPN与PNP的工作原理及快速识别技巧

本文深入浅出地解析了三极管NPN与PNP的核心工作原理。通过“水龙头”比喻,阐明其以小电流控制大电流的放大与开关本质。文章重点对比了NPN与PNP在电流方向、电位关系和控制逻辑上的根本区别,并提供了快速识别技巧与实用的选型、应用指南,帮助电子爱好者与工程师快速掌握这两种基础元件的关键知识。

neovim7hacker的博客 454

python3.12 百分百解决安装dlib失败问题【研究原理后Bug已解决】

python3.12 百分百解决安装dlib失败问题【研究原理后Bug已解决】 python3.12版本下安装dlib失败。截图如下。试了网上很多方法都失败,耗费了很多时间终于找到适用于python3.12版本安装dlib的方法,亲测百分百成功。几乎尝试了所有的方法都不太行。终于找到安装的方法了。 原因分析: 版本匹配问题。我们现在是python3.12 使用pip根本无法安装。下面我们一起手动安装,1分钟搞定。

一键难忘的博客 7129

server sql 分组 去重 字符串拼接_6. 手写代码

6.1 基本算法6.1.1 冒泡排序/*** 冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1)*/public class BubbleSort {public static void bubbleSort(int[] data) {System.out.println("开始排序");int arrayLength = data.length;for (int i = 0; i < ...

weixin_39693950的博客 301

python爬虫项目(六十八):爬取电商平台用户购买历史数据,分析消费行为

本文详细介绍了如何爬取电商平台用户购买历史数据,并分析其消费行为。通过爬虫技术、数据存储、分析和可视化等步骤,可以深入了解消费者的行为特征。未来,随着数据分析技术的不断发展,利用人工智能和机器学习方法对消费行为进行更深层次的分析,将成为电商平台提升竞争力的重要手段。

斌擎科技 2768

Scala实现排序算法

1.冒泡排序 object BubbleSort { /** * 冒泡排序 * 时间复杂度:平均时间复杂度为O(n^2) * 空间复杂度:O(1) */ def sort(list: List[Int]): List[Int] = list match { case List() => List() case head :: tail =&...

陈小哥cw 793

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

scala实现十大排序算法

文章目录swap冒泡选择插入希尔归并快排计数桶基数堆 swap def swap(array: Array[Int], i: Int, j:Int): Unit ={ val tmp = array(i) array(i) = array(j) array(j) = tmp } 冒泡 def bubblingSort(array: Array[Int]): Array[Int] ={ val arr = array for(i <- 1 until a

WGS. 818

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++消除左递归实验代码_大数据相关手写代码面试题(整合完整版)

手写代码1 基本算法1.1 冒泡排序/** * 冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) */ public class BubbleSort { public static void bubbleSort(int[] data) { System.out.println("开始排序"); int arrayLength = data.len...

weixin_28948785的博客 320

基于scala实现十大排序算法

文章目录swap冒泡选择插入希尔归并快排计数桶基数堆主涵 swap def swap(array: Array[Int], i: Int, j:Int): Unit ={ val tmp = array(i) array(i) = array(j) array(j) = tmp } 冒泡 def bubblingSort(array: Array[Int]): Array[Int] ={ val arr = array for(i <- 1 until

忘川的博客 341

Scala练习-排序算法总结

之前用Scala实现了9个排序算法,后续有时间凑个10大。源码已经全部上传到github 冒泡 快排 归并 桶 基数 插入 选择 希尔 堆 其时间复杂度对比如下图(盗图)

doctorq 1605

大数据高频面试题-手写代码

手写代码 2.1 冒泡排序 /** * 冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) */ public class BubbleSort { public static void bubbleSort(int[] data) { System.out.println("开始排序"); int arrayLength = data.length; for (int i = 0; i < arrayLength - 1; i++) {.

weixin_41540362的博客 843

大数据高频面试题--手写代码

第一章 1.1 冒泡排序 /** * 冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) */ public class BubbleSort { public static void bubbleSort(int[] data) { System.out.println("开始排序"); int arrayLength = data.length; ...

xinlinliu 1336

2021超全大数据面试宝典,吐血总结十万字,大数据面试收藏这一篇就够了

本文最新版已发布至公众号【五分钟学大数据】 获取此套面试题最新pdf版,请搜索公众号【五分钟学大数据】,对话框发送面试宝典 扫码获取最新PDF版: 版本 时间 描述 V1.0 2020-02-18 创建 V1.2 2020-06-17 新增 spark 、flink相关面试题 V1.3 ...

yuan_more的博客 1万+

这可能是你见过大数据岗位最全,最规范的面试准备大纲 !(建议收藏)

        本篇博客所分享的知识非常硬核,建议各位看官(尤其是大数据专业的同学啊),赶紧搬好小板凳,带好西瓜,我们边看边吃瓜。 说错了,是带着小本,边看边记下来 申明:本篇仅仅只是作为一个大纲目录,具体内容我会在后续详细展开说明! 为什么这么说,继续往下看大家就明白了~ 文章目录【第一章】 面试说明1.1 面试过程最关键的是什么?1.2 面试时该怎么说?1.3 面试技巧1.3.1 六个常见问题1.3.2 两个注意事项1

大数据梦想家 1万+

面试总结

第1章 面试说明 1.1 面试的本质 面试就是一场秀。 1.2 面试过程最关键的是什么? 1)不是你说了什么,而是你怎么说 2)大大方方的聊,放松 1.3 面试时该怎么说? 1)语言表达清楚 (1)思维逻辑清晰,表达流畅 (2)一二三层次表达 2)所述内容不犯错 (1)不说前东家或者自己的坏话 (2)往自己擅长的方面说 (3)实质,对考官来说,内容听过,就是自我肯定;没听...

m0_46866655的博客 2893

数据结构和算法题

  第一次学数据结构是在大二的时候了,那时候一口气学到了图,计算最小生成树什么的,不过那会都是用的c语言和matlab,也没保存下来,这会也忘记很多了,期间还刷了不少leetcode的题目但也很少记下来==,所以这次就打算开个新坑。 计划是这样的: 新建一个Algorithm空项目,上传到git hub上面,做一道题就新建一个类,把题目描述放在git介绍和类注释上面 至于题目解析的话,就...

weixin_30462049的博客 119

scala二分查找

package com.aura.scala.test object ErFanCaZhao { def main(args: Array[String]): Unit = { //定义一个数组 var arr1=Array(1,3,4,5,6,7,9) //定义要查找的数字 val index=4 //调用方法金Xin val a=binarysearch(arr1,index) //打印输出下...

weixin_44701192的博客 408
上一篇: datax安装,任务配置,原理讲解
adminastrator
博客等级 码龄9年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值