0

我试图弄清楚为什么以下代码不进行合并排序。代码编译良好,没有运行时错误。SortCollection 方法只返回一个未排序的数组。没有编译错误,也没有运行时错误,只返回一个未排序的数组。任何指针都会非常感激。

#include "stdafx.h"
#include <deque>
#include <climits>
#include <stdio.h>

using namespace System;
using namespace System::Collections;
using namespace System::Collections::Generic;

generic <typename T> where T: IComparable<T>
ref class MergeSort
{
public:
// constructor
MergeSort(){}

// SortCollection() method
array<T>^ SortCollection(array<T>^ inputArray)
{
    int n = inputArray->Length;
    if (n <= 1)
    {
        return inputArray;
    }
    array<T>^ array1 = gcnew array<T>(inputArray->Length / 2);
    array<T>^ array2 = gcnew array<T>(inputArray->Length - array1->Length);
    int array1Count = 0;
    int array2Count = 0;
    for (int i = 0; i < n; i++)
    {
        if (i < n / 2)
        {
            array1[array1Count] = inputArray[i];
            array1Count++;
        }
        else
        {
            array2[array2Count] = inputArray[i];
            array2Count++;
        }
    }
    SortCollection(array1);
    SortCollection(array2);
    array<T>^ newArray = gcnew array<T>(inputArray->Length);
    delete inputArray;
    return Merge(newArray, array1, array2);
}

array<T>^ Merge(array<T>^ targetArray, array<T>^ array1, array<T>^ array2)
{
    int n1 = array1->Length;
    int n2 = array2->Length;
    int x1 = 0;
    int x2 = 0;
    int counter = 0;
    while (x1 < n1 && x2 < n2)
    {
        if (array1[x1]->CompareTo(array2[x2]) < 0)
        {
            targetArray[counter] = array1[x1];
            x1 ++;
            counter++;
        }
        else
        {
            targetArray[counter] = array2[x2];
            x2 ++;
            counter++;
        }
    }
    while (x1 < n1) 
    {
        targetArray[counter] = array1[x1];
        counter ++;
        x1 ++;
    }
    while (x2 < n2) 
    {
        targetArray[counter] = array2[x2];
        counter ++;
        x2 ++;
    }
    return targetArray;
}
};
4

2 回答 2

0

嗯...但是您在打印/测试什么?原始数组还是什么 Sort 返回?无论如何,试试这个:

SortCollection(array1);                
SortCollection(array2);          
// array<T>^ newArray = gcnew array<T>(inputArray->Length);
// delete inputArray;                 ---> "reuse" the input array        
return Merge(inputArray, array1, array2);

编辑:我相信你知道这一点,但你只需要更加注意它。

“正常”函数接受参数并返回结果,而不更改参数:

Y=f(x);

您希望x和以前一样,结果在y. 这些都是很好的功能。但是某些函数会改变参数。有时它很明显,比如在

Destroy(x); 

但通常不是很明显,比如

y=sort(x);

通过x“按值”传递是保证不会被更改,但如果函数采用某种引用(如type^ x),它可以直接访问原始变量并可以更改其内容。这种二元性就是你所拥有的(inSortCollection和 in Merge)。你需要决定并“<em>记录”你的函数返回什么以及如何修改它的参数。

在一个版本中(带有delete),您修改了删除它的参数!!!这通常不是一个好主意,必须有很好的记录。排序后的数组作为“返回值”传递(实际上也是一种引用)。此版本修改了参数,但结果在返回中(这就是您需要使用/测试/打印的内容)。

没有删除的版本通过将排序数组放入其中来修改参数。在这种情况下,它可能完全是您想要的。无论如何——记录下来!它也返回对排序数组的引用,即参数。这样做是为了方便,但为了更好的可读性可以排除,并且“返回”只是无效的。

第三种变体可以是,不修改参数,并返回排序后的数组。

于 2013-02-17T00:02:14.873 回答
0

这里有一个问题:

SortCollection(array1);              // array1 is deleted??
SortCollection(array2);              // you dont use any result from here?
array<T>^ newArray = gcnew array<T>(inputArray->Length);
delete inputArray;                   // sort, deleted input array !
return Merge(newArray, array1, array2);

这里对吗??

array1=SortCollection(array1);                
array2=SortCollection(array2);          
array<T>^ newArray = gcnew array<T>(inputArray->Length);
delete inputArray;                     
return Merge(newArray, array1, array2);
于 2013-02-16T21:28:06.990 回答