【算法導論C++代碼】歸併排序

      一個歸併排序卡了一天最後仍是歸併算法有問題,最初是爲了把算法導論的僞代碼轉到c++而加了一些東西,其中在對左右數組的賦值那裏出了問題。由於進行測試時不徹底,就是隻用書上的數組進行測試時,歸併算法部分還好使,而歸併排序很差使,一度覺得是函數遞歸出了問題。如今看來,首先要看懂遞歸模型,而後算法的基礎要弄明白,輸入的參數必定要弄好,不要總弄常量進行測試。ios

//MERGE(A,p,q,r)

// n1=q-p+1

// n2=r-q

// let L[1...n1+1] and R[1..n2+1] be new arrays

// for i=1 to n1

//  L[i]=A[p+i-1]

// for j=1 to n2

//  R[j]=A[q+j]

// L[n1+]=infinity

// R[n2+1]=infinity

// i=1

// j=1

// for k=p to r

//  if L[i]<=R[j]

//  A[k]=L[i]

//  i=i+1

//  else A[k]=R[j]

//  j=j+1

#include <iostream> using namespace std;
void Merge(int A[],int p,int q,int r)

{  int n1=q-p+1;

 int n2=r-q;  

int *L=new(int[n1]);

 int *R=new(int[n2]);

 for (int i=0;i<n1;i++)  

{   L[i]=A[i+p-1];//這兩個地方不能瞎改,跟歸併排序有關,亂改了就會出現歸併沒有法進行的狀況。  }  

L[n1]=10000;

 for (int j=0;j<n2;j++)

 {   R[j]=A[q+j];//這兩個地方不能瞎改  }

   R[n2]=10000;

   int i=0;

   int j=0;  

  int k;

 for (k=p-1;k<r;k++)  

{   

  if (L[i]<=R[j])  

 { 
   A[k]
=L[i];    i++;
}
else { A[k]=R[j]; j++; } } //delete L; //delete R;//一加這兩條程序就死了 } void MergeSort(int A[],int p,int r)//歸併排序 { if( p < r ) { int q=(p+r)/2; MergeSort(A,p,q); MergeSort(A,q+1,r); Merge(A,p,q,r); } } //MERGE-SORT(A,p,r) // if q<r // q=[(p+r/2)] // MERGE-SORT(A,p,q) // MERGE-SORT(A,q+1,r) // MERGE(A,p,q,r) int main() { int A[]={9,8,7,6,5,4,3,2,1,0,6,5,4,3,2}; //int A[]={2,4,5,7,1,2,3,6}; int p,r,q; p=1; //q=4; r=15; cout<<"排序前:"; for (int i=0;i<r;i++) cout<<A[i]<<' '; cout<<endl; MergeSort(A,p,r);//歸併排序 cout<<"排序後:"; for (int i=0;i<r;i++) cout<<A[i]<<' '; cout<<endl; system("pause"); return 0; }
相關文章
相關標籤/搜索