在C ++中合并两个排序列表

时间:2016-05-07 13:14:07

标签: c++ sorting

如何让这段代码生效, 我试图以排序的形式合并这两个列表;

示例:

LIST = 3,8,16,28,50,17,19,30,73,80

其中3,8,16,28,50右手边 和17,19,30,73,80左手边 包含在同一个列表中,但接近两个不同的列表。

这是我的代码:

int main()
{
    int first,last,m,temp, counter = 0,lsize = 11;
    int a[lsize] = {3,8,16,28,50,17,19,30,73,80};

    for(int i = 0 ; i < lsize; i++)
        cout<<a[i]<<" ,";
    cout<<"\n";

    first = 0;
    last = lsize;
    m = (first + last) / 2;
    int i = 0;
    while(counter < lsize){

        if(a[first] < a[m+1] && m+1 < last ){
            counter++;first++;
        }
        else if(a[m+1] < a[first] && first <= m){
            temp = a[m+1];
            shift(a,first,m+1);
            a[counter]=temp;
            counter++;first++;m++;
        }
        else if(m+1 > last && first <= m){
            a[counter]=a[first];
            first++;counter++;
        }
        else if(first > m && m+1 <= last){
            a[counter]=a[m+1];
            m++;counter++;
        }
    }
    for(int i = 0 ; i < lsize; i++)
        cout<<a[i]<<" ,";
    cout<<"\n";

return 0;
}

我一直将此作为输出

3,8,16,17,19,28,30,50,65,73,73

希望有人可以帮助我指出哪里弄错了 感谢

5 个答案:

答案 0 :(得分:0)

列表中有10个元素(lsize),但是在print语句中循环11次(0到lsize-1)。

答案 1 :(得分:0)

STL可以帮助避免错误并浪费时间调试此类常见算法。

std::vector<int> listA {3,8,16,28,50};
std::vector<int> listB {17,19,30,73,80};
std::vector<int> result;
std::merge(listA.begin(), listA.end(), listB.begin(), listB.end(), std::back_inserter(result));

或者正如Jarod42指出的那样,你可以用

来做到这一点
std::vector<int> listA {3,8,16,28,50,17,19,30,73,80};
std::inplace_merge(listA, listA.begin()+5, listA.end());

答案 2 :(得分:0)

使用<algorithm>,您可以

std::inplace_merge(std::begin(a), a + 5, std::end(a)); // a+5 is for 17.

Demo

答案 3 :(得分:0)

非常感谢! 我还发现if(条件)和first if if(条件)缺少如下条件:

 if(a[first] < a[m+1] && m+1 <= last && first <= m )

else if(a[m+1] < a[first] && first <= m && m+1 <= last)

这是每个人的第三个条件。

答案 4 :(得分:-1)

C ++不允许使用可变大小的列表。因此,您应该在代码的第二行出错。我不知道它是如何为您工作的。其次,lsize应该是10而不是11。