啃算法导论之合并两个有序数组

@

思路:

  • 记两个数组分别为a1,a2,合并后的数组为a,设置两个迭代变量 i、j分别指向数组a1,a2,初始化 i=j=0,
  • 若a1[i] <= a2[j],则可以添加a1的元素到合并后的数组 a,同时 i++;条件不满足,添加 a2 的元素到 a,j++。
  • 如果一个数组被遍历完,则应该终止;添加未遍历完的数组的其余元素到 a

这儿提供几种c++版本的

c++版本1

vector<int> merge(vector<int> &a1, vector<int> &a2)
{
    if(a1.empty()) return a2;  // 做个简单的检查
    if(a2.empty()) return a1;

    vector<int> a;
    int i = 0,j = 0;   // 初始化
    while(i < a1.size() && j < a2.size()){
        while(a1[i]<=a2[j] && i < a1.size()){   //主要是适合其中一个数组里面的元素是总体偏大的情况,举个极端例子 a1=[1,2,3,4,6],a2 =[5,8,9,11,25,32]
            a.push_back(a1[i]);
            ++i;
        }
        while(a1[i]>=a2[j] && j < a2.size()){
            a.push_back(a2[j]);
            ++j;
        }
    }
    // 有个数组所有元素都加到a中了
    while(i < a1.size()){
        a.push_back(a1[i]);
        i++;
    }
    while(j < a2.size()){
        a.push_back(a2[j]);
        j++;
    }
    return a;
}

c++版本2

vector<int> merge(vector<int> &a1, vector<int> &a2)
{
    if(a1.empty()) return a2;  // 做个简单的检查
    if(a2.empty()) return a1;

    vector<int> a;
    int i = 0,j = 0;   // 初始化
    while(i < a1.size() && j < a2.size()){
        if(a1[i] <= a2[j]){   //主要是适合两个数组里面的元素基本分布基本一致的情况,都横跨整个范围,比如   a1=[1,3,5,7,9,11],a2 =[2,4,6,8,10,12]
            a.push_back(a1[i]);
            ++i;
        }
        else{
            a.push_back(a2[j]);
            ++j;
        }
    }
    // 有个数组所有元素都加到a中了
    while(i < a1.size()){
        a.push_back(a1[i]);
        ++i;
    }
    while(j < a2.size()){
        a.push_back(a2[j]);
        ++j;
    }
    return a;
}

c++版本3

可以把 ++ 给吸收进 push_back()

vector<int> merge(vector<int> &a1, vector<int> &a2)
{
    if(a1.empty()) return a2;  // 做个简单的检查
    if(a2.empty()) return a1;

    vector<int> a;
    int i = 0,j = 0;   // 初始化
    while(i < a1.size() && j < a2.size()){
        if(a1[i] <= a2[j]){
            a.push_back(a1[i++]);
        }
        else{
            a.push_back(a2[j++]);
        }
    }
    // 有个数组所有元素都加到a中了
    while(i < a1.size()){
        a.push_back(a1[i++]);
    }
    while(j < a2.size()){
        a.push_back(a2[j++]);
    }
    return a;
}

python版 返回值都是列表

1、 参数是列表

def merge(a1, a2):
    if not a1:      #做个简单的检查
        return a2 
    if not a2:
        return a1
    a = []
    i, j = 0, 0     # 初始化
    while i < len(a1) and  j < len(a2):
        if a1[i] <= a2[j]:
            a.append(a1[i])
            i = i+1
        else:
            a.append(a2[j])
            j = j+1
   # 有个数组所有元素都加到a中了
    while i < len(a1):
        a.append(a1[i])
        i = i+1
    while j < len(a2):
        a.append(a2[j])
        j = j+1
    return a

既然是列表,那么追加一个列表到另个列表后面可以用 extend()

def merge(a1, a2):
    if not a1:
        return a2  #做个简单的检查
    if not a2:
        return a1
    a = []
    i, j = 0, 0  # 初始化
    while i < len(a1) and  j < len(a2):
        if a1[i] <= a2[j]:
            a.append(a1[i])
            i = i+1
        else:
            a.append(a2[j])
            j = j+1
   # 有个数组所有元素都加到a中了
    if i < len(a1):
        a.extend (a1[i:])
    if j < len(a2):
        a.extend(a2[j:])
    return a

调用的代码

a1 = [1,5,7,9,11,14,15,18,21]
a2 = [2,4,6,8,10,12]
a = merge(a1,a2)
print(a)

2、参数是 np 数组

def merge(a1, a2):
    if not a1.size:     #做个简单的检查
        return a2  
    if not a2.size:
        return a1
    a = []
    i, j = 0, 0  # 初始化
    while i < len(a1) and  j < len(a2):
        if a1[i] <= a2[j]:
            a.append(a1[i])
            i = i+1
        else:
            a.append(a2[j])
            j = j+1
   # 有个数组所有元素都加到a中了
    if i < len(a1):
        a.extend (a1[i:])
    if j < len(a2):
        a.extend(a2[j:])
    return a

调用的代码

a1 = np.array([1,5,7,9,11,14,15,18,21])
a2 =np.array([2,4,6,8,10,12])
a = merge(a1,a2)
print(a)

3、统一起来

def merge(a1, a2):
    if not len(a1) :     #做个简单的检查
        return a2  
    if not len(a2) :
        return a1
    a = []
    i, j = 0, 0  # 初始化
    while i < len(a1) and  j < len(a2):
        if a1[i] <= a2[j]:
            a.append(a1[i])
            i = i+1
        else:
            a.append(a2[j])
            j = j+1
   # 有个数组所有元素都加到a中了
    if i < len(a1):
        a.extend (a1[i:])
    if j < len(a2):
        a.extend(a2[j:])
    return a
posted on 2021-06-11 09:04  雾恋过往  阅读(60)  评论(0)    收藏  举报

Live2D