簡體   English   中英

C ++中的mergesort算法

[英]mergesort algorithm in c++

我有以下代碼

#include <iostream>
using namespace std;
void merge(int c[],int a[],int n,int b[],int m){
         for (int i=0,j=0,k=0;k<n+m;k++){

             if (i==n) {  c[k]=b[j++]; continue;}
             if (j==m ){  c[k]=a[i++];continue;}

             c[k]=(a[i]<b[j])? a[i++]:b[j++];

         }



}
void mergesort(int a[],int b[],int l,int r){
if (l>r)  return ;
     int m=(l+r)/2;

     mergesort(b,a,l,m);
     mergesort(b,a,m+1,r);

 merge(a+l,b+l,m-l+1,b+m+1,r-m);

}
int main(){


    int a[]={12,4,2,5,3,6,7,8,10,11};
const   int n=sizeof(a)/sizeof(int);
int b[n];
mergesort(a,b,0,n-1);
    for (int i=0;i<n;i++){

        cout<<b[i]<< "  ";

    }




     return 0;
}

但這是警告

1>------ Rebuild All started: Project: mergesort, Configuration: Debug Win32 ------
1>  mergesort.cpp
1>d:\c++_algorithms\mergesort\mergesort\mergesort.cpp(24): warning C4717: 'mergesort' : recursive on all control paths, function will cause runtime stack overflow
1>  mergesort.vcxproj -> D:\c++_algorithms\mergesort\Debug\mergesort.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

請幫我解決

我已經更新了我的代碼

mergesort()需要檢測是否要求對長度為一的列表進行排序,如果是,則立即返回。 另外,我可能是錯的,但是我認為對merge()的調用是對mergesort()的遞歸調用之后進行的。

您的遞歸調用應具有終止條件,以便遞歸調用將在某個時刻結束。
我認為在您的mergesort函數的開頭添加以下條件可以解決此問題:

if(l>r)
    return;

您需要有一個基本情況,這可能意味着您應該檢查要排序的數組的大小是否為= 1,如果是,則返回該特定元素本身。

在代碼中,這意味着檢查類似

l==r

同樣,從邏輯上講,應該在對兩個子數組進行排序之后調用merge。

您需要在mergeSort函數中指定基本情況! 而且,在mergeSort算法中,合並調用是在對左側和右側子數組進行遞歸調用之后進行的

暫無
暫無

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

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