我實現了在100,000個整數文件上使用的MergeSort算法。它負責分類並收集文件中的反轉。它適用於小型測試陣列,但只要插入實際文件,就會發生內存不足錯誤。我如何解決它? 歸併過程中出現錯誤,在我的輔助的數組元素的個數12500 這裏是我的代碼:C# - MergeSort,內存不足
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assignment_1
{
class Program
{
static void Main(string[] args)
{
List<int> data = File2Array("IntegerArray.txt");
int[] unsorted = data.ToArray();
List<string> inversions = new List<string>();
Sort(ref unsorted, ref inversions);
Console.WriteLine("number of inversions is: " + inversions.Count());
Console.ReadLine();
}
public static void Sort(ref int[] unsorted, ref List<string>inversions)
{
int size = unsorted.Length;
if (size == 1)
return;
int mid = size/2;
int leftSize = mid;
int rightSize = size - leftSize;
int[] left = new int[leftSize];
int[] right = new int[rightSize];
Array.Copy(unsorted, 0, left, 0, leftSize);
Array.Copy(unsorted, mid, right, 0, rightSize);
Sort(ref left, ref inversions);
Sort(ref right, ref inversions);
int[] aux = new int[leftSize + rightSize];
for (int i = 0, j = 0, k = 0; k < aux.Length; k++)
{
if (left[i] < right[j])
{
aux[k] = left[i++];
// if left array is exhausted, copy the remaining right array elements over
if (i == leftSize)
{
Array.Copy(right, j, aux, ++k, rightSize - j);
unsorted = aux;
break;
}
}
else
{
int temp = i;
while (temp < leftSize)
{
inversions.Add(left[temp++] + "-" + right[j]);
}
aux[k] = right[j++];
if (j == rightSize)
{
Array.Copy(left, i, aux, ++k, leftSize - i);
unsorted = aux;
break;
}
}
}
}
public static List<int> File2Array(string file)
{
List<int> data = new List<int>();
using (StreamReader reader = new StreamReader(file))
{
int line;
do
{
int.TryParse(reader.ReadLine(), out line);
data.Add(line);
}
while (!reader.EndOfStream);
}
return data;
}
}
}
我敢打賭,你在這裏有一個無限循環。 –
沒有無限循環。我用多個小尺寸的輸入測試它,一切正常。 – haosmark
在我看來,你正在存儲2份數據。一個作爲List,另一個作爲數組。堅持一個或另一個。你的排序例程也遞歸地製作更多的副本。 – tinstaafl