在c ++中合并排序实现

时间:2014-12-10 14:56:45

标签: c++ sorting mergesort

我试图实现CLRS第3版中给出的合并排序算法。 我没有使用sentinel值,而是检查了合并操作中的边界。

以下是我的合并排序实现

#include <cstdlib>
#include <iostream>
#include <cmath>

using namespace std;

void merge(int [],int p,int q ,int r);
void mergeSort(int [],int p,int r);
int main(int argc, char** argv)
{
    int input[10];

    for(int i = 0 ; i < 10 ; i++){
        input[i] = (rand()%100)+10;
    }
    mergeSort(input,0,9);
    cout<<endl;
    for(int i = 0 ;i <10; i++){
        cout<<input[i]<<"\t";

    }
    cout<<endl;

    return 0;
}

void mergeSort(int  input[],int lower, int higher)
{
    if(lower<higher){
        int mid = (lower + higher)/2;
        mergeSort(input,lower,mid);
        mergeSort(input,mid+1,higher);
        merge(input,lower,mid,higher);
    }
}
void merge(int input[], int lower, int mid , int higher)
{
    int sizeLeft = mid - lower +1;

    int sizeRight = higher - mid;

    int *leftArray = new int(sizeLeft);

    int *rightArray  = new int(sizeRight);

    for(int i = 0 ; i < sizeLeft ; i++){
        leftArray[i] = input[i+lower];
    }
    for(int j = 0 ; j < sizeRight ; j++){
        rightArray[j] = input[mid+j+1];
    }

    int i = 0 ;
    int j =0;

    for (int k  = lower ; k <= higher ; k++){

        if(leftArray[i]<=rightArray[j] || j>higher){
            input[k]= leftArray[i];
            i =  i + 1;

        }else if(rightArray[j]< leftArray[i] || i>mid){
            input[k] = rightArray[j];
            j = j+1;
        }
    }
}

我为程序的每次运行获得以下输出

25 0 0 31 0 0 45 0 87 0

基本上我随机生成10个数字并将它们复制到数组中,然后使用合并排序对数组进行排序。

请帮帮我。提前谢谢。

--EDIT--

我在完成调试器后做了以下更改,得到了正确的答案。 在合并操作中,我将其更改为:

void merge(int input[], int lower, int mid , int higher)
{
    int sizeLeft = mid - lower +1;

    int sizeRight = higher - mid;

    int *leftArray = new int[sizeLeft];

    int *rightArray  = new int[sizeRight];

    for(int i = 0 ; i < sizeLeft ; i++){
        leftArray[i] = input[i+lower];
    }
    for(int j = 0 ; j < sizeRight ; j++){
        rightArray[j] = input[mid+j+1];
    }

    int i = 0 ;
    int j =0;

    for (int k  = lower ; k <= higher ; k++){

        if((i+lower)>mid){
            input[k]= rightArray[j++];
        }else if((j+mid+1)>higher){
            input[k] = leftArray[i++];
        }else if(leftArray[i]<= rightArray[j]){
            input[k] = leftArray[i++];
        }else{
            input[k] = rightArray[j++];
        }
    }

    delete [] leftArray;
    delete [] rightArray;
}

1 个答案:

答案 0 :(得分:3)

您的算法可能有问题但突出的是内存处理错误。

当你说:

int *leftArray = new int(sizeLeft);

您为 int分配内存,并使用sizeLeft的值对其进行初始化。这显然不是你想要的。如果您想为int数组分配内存,您应该说:

int *leftArray = new int[sizeLeft];

注意方括号而不是括号。

在函数返回之前,您也不会释放内存,因此每次调用时都会泄漏内存。要释放你需要做的记忆:

delete [] leftArray;

话虽如此,这是C ++,有更好的方法可以拥有动态数组,例如std::vector