一個歸併排序卡了一天最後仍是歸併算法有問題,最初是爲了把算法導論的僞代碼轉到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; }