合并排序无法在流程结束时合并部件

时间:2016-09-12 15:19:19

标签: c++ algorithm sorting data-structures mergesort

我尝试使用

的简单案例进行排序
test = {12, 11, 13, 5, 6};

它将lefthalf和righthalf中的子部分拆分并合并为

{11 12} & {5 6 13} 

是理想的。 但在最终合并期间,它将lefthalf和righthalf视为

{12 11} & {13 5 6}

这给出了错误的答案:

{12 11 13 5 6} 

为什么会发生这种情况?这是我的代码。

void mergesrt(deque<int> mydeq){
 if (mydeq.size() > 1){
    int mid = mydeq.size()/2;
    deque<int> lefthalf(mydeq.begin(), mydeq.begin() + mid);
    deque<int> righthalf(mydeq.begin() + mid, mydeq.begin() + mydeq.size());  
    mergesrt(lefthalf);
    mergesrt(righthalf);
    int i = 0;
    int j = 0;
    int k = 0;
    cout << "--------------merging-----------" << endl;

    while (i < lefthalf.size() && j < righthalf.size()){
     if (lefthalf[i] < righthalf[j]){
            mydeq[k] = lefthalf[i];
            k++;
            i++;
     }
     else{
           mydeq[k] = righthalf[j];
           k++;
           j++;
           }
          }

     while (i < lefthalf.size()){
            mydeq[k] = lefthalf[i];
            k++;
            i++;
            }

     while (j < lefthalf.size()){
            mydeq[k] = righthalf[j];
            k++;
            j++;
            }
           }

       return;
       }

1 个答案:

答案 0 :(得分:4)

这里的问题很微妙,新开发人员不容易注意到。您通过值将参数传递给mergsrt,这意味着要制作副本。排序在此副本上完成,原始双端队列不会更改。您需要通过引用(mergsrt(deque<int> &))来传递。