2013-02-16 87 views
0

我想弄清楚为什么下面的代码不会做合并排序。代码编译得很好,没有运行时错误。 SortCollection方法只返回一个未排序的数组。没有编译错误和没有运行时错误,只是返回一个未排序的数组。任何指针都会受到极大的关注。Visual C++合并排序

#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; 
} 
}; 

回答

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)它可以直接访问原始变量并可以更改其内容。这种双重性是你所拥有的(在SortCollectionMerge)。您需要决定,并且“文档”您的函数返回什么以及如何修改它所采用的参数。

在一个版本中(与delete),您修改参数删除它 !!!这通常不是一个好主意,必须要有很好的记录。并且排序的数组作为“返回值”传递(这也是一种真正的参考)。这个版本修改了参数,但结果是返回的(这就是你需要使用/ test/print的东西)。

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

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

+0

非常感谢,你的建议解决了我的问题。显然更高效。我试图弄清楚,为什么它在我重新使用原始数组时工作,但在传递相同大小的新数组时不起作用。如果你有一个想法,我会欣赏一点额外的理解! – deadEddie 2013-02-17 02:06:08

+0

@deadEddie你打印/测试什么? ..见编辑 – qPCR4vir 2013-02-18 09:50:49

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); 
+0

没有骰子。仍然得到一个未排序的数组作为retult – deadEddie 2013-02-16 22:28:09