啃算法导论之合并两个有序数组
@
思路:
- 记两个数组分别为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
浙公网安备 33010602011771号