C++學習連載—合併排序及其遇到的問題

我這裏就不對合並排序的思想給予介紹了,感興趣的朋友可以查閱相關的算法書籍,我就講講我在編寫程序的過程中遇到的問題以及解決方法。

這是我剛開始寫的一個子程序

void _merge(int A[],int p,int q,int r)
{
    int n1=q-p+1;
    int n2=r-q;
    //int* L=new int[n1+1];
    //int* R=new int[n2+1];
    int L[n1+1];
    int R[n2+1];
    int i,j;
    for(i=0;i<=n1-1;i++)
        L[i]=A[p+i];
    for(j=0;j<=n2-1;j++)
        R[j]=A[q+j+1];
    L[n1]=2147483647;
    R[n2]=2147483647;
    i=0;
    j=0;
    int k;
    for(k=p;k<=r;k++)
    {
        if(L[i]<=R[j])
        {
            A[k]=L[i];
            i++;
        }
        else
        {
            A[k]=R[j];
            j++;
        }
    }
//    delete [] L;
//    delete [] R;
}

編譯結果

意思是說,我們在定義數組時,數組大小必須爲常量,因爲它是靜態分配存儲空間的,後來我試圖把n1和n2兩個變量改爲const型,結果仍是編譯通不過,無奈之下,我只能採用new,delete進行動態分配的方式定義數組,結果編譯0error,0warning

一下爲修改過的程序。

void _merge(int A[],int p,int q,int r)
{
    int n1=q-p+1;
    int n2=r-q;
    int* L=new int[n1+1];
    int* R=new int[n2+1];
    int i,j;
    for(i=0;i<=n1-1;i++)
        L[i]=A[p+i];
    for(j=0;j<=n2-1;j++)
        R[j]=A[q+j+1];
    L[n1]=2147483647;
    R[n2]=2147483647;
    i=0;
    j=0;
    int k;
    for(k=p;k<=r;k++)
    {
        if(L[i]<=R[j])
        {
            A[k]=L[i];
            i++;
        }
        else
        {
            A[k]=R[j];
            j++;
        }
    }
    delete [] L;
    delete [] R;
}

下面爲其它的子程序

#include"_Merge.h"
void merge_sort(int A[],int p,int r)
{
    int q;
    if(p<r)
    {
        q=(p+r)/2;
        merge_sort(A,p,q);
        merge_sort(A,q+1,r);
        _merge(A,p,q,r);
    }
}



#ifndef _MERGE_H
#define _MERGE_H
void _merge(int A[],int p,int q,int r);
#endif


#ifndef _MERGE_SORT_H_
#define MERGE_SORT_H_
void merge_sort(int A[],int p,int r);
#endif


試驗主程序

#include<iostream>
#include"_Merge.h"
#include"Merge_Sort.h"
using namespace std;
int main()
{
    int A[]={3,41,52,26,38,57,9,49};
    merge_sort(A,0,7);
    for(int i=0;i<8;i++)
        cout<<A[i]<<" ";
    cout<<endl;
    return 0;
}

試驗結果




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章