我需要浏览a和b数组,将a和b中的元素复制到组合中,以便组合最终被排序。
例如,如果a为{3,5,7,7,9}且b为{2,5,8,1234}(因此组合必须有9个元素),则此函数将组合设置为{2 ,3,5,5,7,7,8,9,1234}。我需要有效率:当我将值放入组合时,我需要将它们放在正确的位置;不要随意地重新安排它们。
我在while循环中尝试了一个嵌套的for循环,但是我得到了一些奇怪的结果。我似乎无法找到一种方法来超越最低数字。例如,一旦我将最小的数字添加到组合数组中,我可以; t弄清楚如何丢弃它本身。谢谢您的帮助。
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;
}
}
答案 0 :(得分:4)
除非这是家庭作业,否则请使用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++]
答案 1 :(得分:3)
我认为这是某种类型的家庭作业,如果不是,只需使用std::merge
。
如果你想手动滚动它,你需要考虑使用三个游标:两个是两个不同数组的输入游标,另一个是输出(写)游标。
在决定要移动下一个元素的数组之后,需要复制和更新两个游标,即该数组中的读取游标(因为该元素已被使用)并且最终数组中的写入游标(因为该位置已被写入)。
我希望这足以引导您找到解决方案:)
答案 2 :(得分:1)
以下是您可以尝试的标准内容列表:http://www.cplusplus.com/faq/sequences/sequencing/sort-algorithms/
另外,你有没有在psuedo-code中考虑过这样的事情:
创建一个新数组[旧数组的大小减一] mempcy(新数组,开始删除点-1) mempcy(新阵列,删除点+ 1到结束)
从新数组中排序
再次罚款最低数字......
答案 3 :(得分:0)
这是一个非常紧凑的解决方案,应该易于阅读和理解。
我假设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 ++。
答案 4 :(得分:0)
假设这是用于家庭作业或类似的东西,并且你不允许使用像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++];
}