Scala排序算法之归并排序解析

 更新时间:2023年10月31日 10:45:11   作者:哇哈哈水有点甜  
这篇文章主要介绍了Java排序算法之归并排序解析,简介:归并排序是一种经典的排序算法,它采用分治的思想,将待排序的数组不断地分割成小的子数组,然后再将这些子数组合并成有序的数组,需要的朋友可以参考下

Scala实现归并排序解析

利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题,然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)

优势:

对于巨大的数据集,如果要求Top N这种操作,由于不能把数据一次性读进内存,快排无法发挥作用,这时可以采取归并的方法,将大的数据集分成多个小的数据集,然后分别求Top N,再进行归并,最后从归并的结果中求出Top N。

在这里插入图片描述

在这里插入图片描述

代码实现(Scala)

object MergeSort {
    /**
      * 测试归并排序
      * @param args
      */
    def main(args: Array[String]): Unit = {
        var arr = Array(-8, 4, 1, 889, 56, -37)
        var tmp = new Array[Int](arr.length)
        mergeSort(arr, 0, arr.length-1, tmp)
        for (elem <- arr) {
            println(elem)
        }
    }

    /**
      *
      * @param arr   待排序的数组
      * @param left  :最初的左边的下标:0
      * @param right :最初的右边下标:length-1
      * @param tmp   :临时数组,事先开辟好的,大小和arr一样
      */

    def mergeSort(arr: Array[Int], left: Int, right: Int, tmp: Array[Int]): Unit = {
        if (left < right) {
            //只要left<right,就可以继续分,直到将所有元素全部打散成单个
            //取数组中间值下标
            val mid = (left + right) / 2
            //对数组中间元素左侧递归切分
            mergeSort(arr, left, mid, tmp)
            //对数组中间元素右侧递归切分
            mergeSort(arr, mid + 1, right, tmp)
            //merge是合并的操作
            merge(arr, left, mid, right, tmp)
        }
    }

    def merge(arr: Array[Int], left: Int, mid: Int, right: Int, tmp: Array[Int]) = {
        var i = left //左边的开始下标
        var j = mid + 1 //右边的开始下标
        var t = 0 //临时数组tmp的下标
        while (i <= mid && j <= right) {//同时满足这两个条件,说明中间元素左右两侧均还有元素未放到临时排序数组中
            if (arr(i) <= arr(j)) {
                //如果当前的左边的有序列表的值小于当前的右边有序列表的值,把小的值拷贝到tmp数组中,然后下标后移1位
                tmp(t) = arr(i)
                i += 1
                t += 1
            } else {
                tmp(t) = arr(j)
                t += 1
                j += 1
            }
        }
        //不满足第一个while条件说明有一侧数据已经全部拷贝到tmp数组中了
        while (i <= mid) {
            //如果左边的有序列表中还有数据,依次拷贝到tmp数组中
            tmp(t) = arr(i)
            i += 1
            t += 1
        }
        while (j <= right) {
            //如果右边的有序列表中还有数据,依次拷贝到tmp数组中
            tmp(t) = arr(j)
            j += 1
            t += 1
        }
        //将本次的tmp数组的数据拷贝到原数组arr中
        t = 0
        //注意这里原数组下标tmpLeft不从0开始,而是从left开始,因为
        var tmpLeft = left
        while (tmpLeft <= right) {
            arr(tmpLeft) = tmp(t)
            tmpLeft += 1
            t += 1
        }
    }
}

到此这篇关于Scala排序算法之归并排序解析的文章就介绍到这了,更多相关Scala实现归并排序解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Gradle如何构建scala多模块工程的步骤详解

    利用Gradle如何构建scala多模块工程的步骤详解

    这篇文章主要给大家介绍了关于如何利用Gradle构建scala多模块工程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Scala排序算法之归并排序解析

    Scala排序算法之归并排序解析

    这篇文章主要介绍了Java排序算法之归并排序解析,简介:归并排序是一种经典的排序算法,它采用分治的思想,将待排序的数组不断地分割成小的子数组,然后再将这些子数组合并成有序的数组,需要的朋友可以参考下
    2023-10-10
  • 浅谈Scala的Class、Object和Apply()方法

    浅谈Scala的Class、Object和Apply()方法

    下面小编就为大家带来一篇浅谈Scala的Class、Object和Apply()方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Scala实现二分查找的代码实例

    Scala实现二分查找的代码实例

    这篇文章主要介绍了Scala实现二分查找的代码实例,找到数组的中间值,和需要查找的值进行对比:如果中间值等于查找值,直接返回中间值下标;如果中间值大于查找值,则递归向左边查找;如果中间值小于查找值,则递归向右边查找,直到找完所有的元素,需要的朋友可以参考下
    2023-11-11
  • Scala基础简介及代码示例

    Scala基础简介及代码示例

    这篇文章主要介绍了Scala基础简介及代码示例,小编觉得挺不错的,这里给大家分享下,供需要的朋友参考。
    2017-10-10
  • Scala基础语法总结

    Scala基础语法总结

    这篇文章主要介绍了Scala基础语法总结,需要的朋友可以参考下
    2023-10-10
  • Windows7下安装Scala 2.9.2教程

    Windows7下安装Scala 2.9.2教程

    这篇文章主要介绍了Windows7下安装Scala 2.9.2教程,本文给出了Scala的安装步骤以及在Eclipse IDE安装Scala的步骤,需要的朋友可以参考下
    2015-03-03
  • Scala安装及环境图文配置教程

    Scala安装及环境图文配置教程

    这篇文章主要为大家详细介绍了Scala安装及环境图文配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论