把最低的数字放在第一位,把两个数组组合成一个
Combining two arrays into one by putting the lowest numbers in first
我需要遍历a和b数组,将元素从a和b复制到combo中,使combo最终被排序。
例如,如果a是{3,5,7,9},b是{2,5,8,1234}(因此combo必须有9个元素),则此函数将combo设置为{2,3,5,7,8,91234}。我需要有效地做到这一点:当我把值放入组合框时,我需要把它们放在正确的位置;不要随意,以后再重新排列。
我在while循环中尝试了嵌套for循环,但得到了一些奇怪的结果。我似乎想不出一个办法来超过最低的数字。例如,一旦我将最低的数字添加到组合数组中,我就可以;I don’我不知道如何丢弃它。谢谢你的帮助。
void merge(
unsigned combo[],
const unsigned a[],
unsigned aElements,
const unsigned b[],
unsigned bElements
){
if (mySort(a, aElements) == 0) {
cout << "The first array is not sorted";
exit(1);
}
if (mySort(b, bElements) == 0) {
cout << "The second array is not sorted";
exit(1);
}
unsigned combinedElements;
unsigned lowest = 0;
unsigned i = 0;
combinedElements = aElements + bElements;
while (i < combinedElements) {
for (int n = 0; n < combinedElements; n++) {
if (a[i] < b[n]) {
lowest = a[i];
}
else {
lowest = b[n];
}
}
combo[i] = lowest;
i++;
cout << combo[i] << endl;
}
}
除非这是家庭作业,否则使用std::merge
void merge(
unsigned combo[],
const unsigned a[],
unsigned aElements,
const unsigned b[],
unsigned bElements
){
std::merge(a, a+aElements, b, b+bElemnts, combo);
}
如果是作业,请尝试以下算法:
index_result = 0; index_a = 0; index_b = 0;
while(index_a < size_a && index_b < size_b)
if(a[index_a] < b[index_b])
result[index_result++] = a[index_a++]
else
result[index_result++] = b[index_b++]
while(index_a < size_a)
result[index_result++] = a[index_a++]
whle(index_b < size_b)
result[index_result++] = b[index_b++]
我假设这是某种类型的家庭作业,如果不是,只使用std::merge
。
如果您想手动推出它,您需要考虑使用三个游标:两个是两个不同数组中的输入游标,另一个是输出(写入)游标。
在决定要从哪个数组中移动下一个元素后,您需要复制和更新两个游标,即该数组中的读取游标(因为该元素已经被使用)和最终数组中的写入游标(因为那个位置已经被写入)。
我希望这足以引导您找到一个解决方案:)
以下是您可以尝试的标准方法列表:http://www.cplusplus.com/faq/sequences/sequencing/sort-algorithms/
另外,你有没有考虑过类似的东西,在psuedo代码中:
创建一个新数组[旧数组的大小减去一]mempcy(新数组,从删除点开始-1)mempcy(新阵列,移除点+1到结束)
从新阵列排序
再次对最低数字进行罚款。。。
这里有一个非常紧凑的解决方案,应该很容易阅读和理解。
我假设combo
有足够的空间来拟合结果,并且a
和b
已经排序(正如您的示例所示):
void merge(unsigned combo[],
const unsigned a[],
unsigned aElements,
const unsigned b[],
unsigned bElements)
{
while(aElements + bElements > 0)
{
if(bElements == 0 || (aElements > 0 && *a < *b))
{
aElements--;
*combo++ = *a++;
}
else
{
bElements--;
*combo++ = *b++;
}
}
}
它可以稍微调整一下以获得更好的性能,但它非常优雅且可读。另外,此代码同时兼容C和C++。
假设这是一项家庭作业或类似的任务,并且不允许使用std::merge
等标准内容,则2个排序列表的合并算法可以以线性复杂度完成,如下所示:
void merge( unsigned combo[], const unsigned a[], unsigned aElements, const unsigned
b[], unsigned bElements ){
if (mySort(a, aElements) == 0) {
cout << "The first array is not sorted";
exit(1);
}
if (mySort(b, bElements) == 0) {
cout << "The second array is not sorted";
exit(1);
}
int i,j,k =0;
while (i<aElements && j<bElements)
{
if (a[i]<=b[j])
{
combo[j++]=a[i++];
} else
{
combo[j++]=b[j++];
}
}
//add remaining elements. at least one of these loops will not happen
while (i < aElements) combo[j++]=a[i++];
while (j < bElements) combo[j++]=b[j++];
}
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何在加密++中将两个源组合成新的源
- 测试两个类型列表中的所有组合
- 如何将这两个函数组合成一个实现?
- 如何将两个代码组合成一个函数?
- 如何组合两个整数向量
- 在C++中将返回unique_ptr和shared_ptr的两个工厂方法组合为一个
- 在编译时将两个或多个不同大小的数组合并为一个数组
- 如何沿行组合两个向量?
- 我在 c++ 中组合了两个字符串,但放错了
- 组合两个用不同高级语言编程的 Web 组装组件
- 将两个不同的设备捕获框架组合到一个框架中,然后写一个视频
- 如何使用超载 运算符组合两个链接列表
- 数据的所有组合都是产品的两个整数
- 使用两个列表中的组合生成函数调用
- 将两个矩阵组合在一起,然后用一个值组织另一个值
- C++组合两个以零结尾的字符串
- 找到两个向量数组的组合,该数组的总和是 c++ 中所有其他组合的最大值
- 最后一行欧普特两个组合输出问题?如果其他语句
- Win32 API从带有两个组合框的对话框中读取组合框值