簡體   English   中英

在 C++ 中合並兩個排序列表

[英]Merging two sorted list in C++

我如何讓這段代碼工作,我試圖以排序的形式將這兩個列表合並在一起;

例子:

列表 = 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

希望有人能幫我指出哪里出錯了謝謝

您的列表中有 10 個元素 (lsize),但是在打印語句中循環了 11 次(0 到 lsize-1)。

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());

使用<algorithm> ,你可以

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

演示

非常感謝各位!! 我還發現 if(condition) 和 first if else(condition) 缺少一個條件,如下所示:

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

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

這是每個人的第三個條件。

C++ 不允許可變大小的列表。 所以,你應該在你的代碼的第二行得到一個錯誤。我不知道它是如何為你工作的。 其次,lsize 應該是 10 而不是 11。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM