合并已排序的数组

  • 数组合并
  • 实现一
  • 实现二
  • 多路合并

数组合并

条件:

  1. 两个数组分别已经升序排列

要求:

  • 合并两个数组并返回新的已经排序后的数组

分析该题目,其要求与归并排序的实现思想相同

归并排序的算法中,使用“分治”策略,而这道题的实现逻辑,仅需要用到归并算法中的“治”

实现一

fun mergeArray(first: Array, sec: Array): Array {
    val temp = Array(first.size + sec.size) { 0 }
    var t = 0

    var i = 0
    var j = 0
    // 取较短的数组作为loop条件
    var mid = if (first.size <= sec.size) first.size - 1 else sec.size - 1
    while (i <= mid && j <= mid) {
        //关键的逻辑在于这行
        temp[t++] = if (first[i] < sec[j]) first[i++] else sec[j++]
    }

   // 将first数组中剩余的元素追加到temp
    while (i <= first.size - 1) {
        temp[t++] = first[i++]
    }
    // 将sec数组中剩余的元素追加到temp
    while (j <= sec.size - 1) {
        temp[t++] = sec[j++]
    }

    return temp
}

实现二

前面的实现,并未能去除重复的元素,增加题目的要求

  • 合并后的数组,如果包含相同元素,则只保留一个
fun mergeArray(first: Array, sec: Array): Array {
    val temp = Array(first.size + sec.size) { 0 }
    var t = 0

    var i = 0
    var j = 0
    var k: Int
    // 取较短的数组开始loop
    var mid = if (first.size <= sec.size) first.size - 1 else sec.size - 1
    while (i <= mid && j <= mid) {
        //关键的逻辑在于这行
        k = if (first[i] < sec[j]) first[i++] else sec[j++]
        //过滤重复元素
        if (t > 0 && k == temp[t - 1]) continue
        temp[t++] = k
    }

    // 将first数组中剩余的元素追加到temp
    while (i <= first.size - 1) {
        k = first[i++]
        if (t > 0 && k == temp[t - 1]) continue
        temp[t++] = k
    }
    // 将sec数组中剩余的元素追加到temp
    while (j <= sec.size - 1) {
        k = sec[j++]
        if (t > 0 && k == temp[t - 1]) continue
        temp[t++] = k
    }

    return temp
}

多路合并

以上的数组合并只是两个数组,继续引申出,多个有序数组进行合并,并去重排序;

你可能感兴趣的:(算法,排序,kotlin)