J'ai implémenté l'algorithme MergeSort utilisé sur un fichier de 100 000 entiers. Il s'occupe du tri et recueille les inversions qui sont dans le fichier. Cela fonctionne avec de petites baies de test, mais dès que je branche le fichier réel, je n'ai plus d'erreur de mémoire. Comment je le répare? L'erreur se produit au cours de mergesort, et le nombre d'éléments dans mon tableau est aux 12500 Voici mon code:C# - MergeSort, à court de mémoire
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;
}
}
}
Je parie que vous avez une boucle infinie ici. –
Pas de boucle infinie. Je l'ai testé avec plusieurs entrées de plus petite taille et tout allait bien. – haosmark
Il me semble que vous stockez 2 copies des données. Un en tant que liste et l'autre en tant que tableau. Stick avec l'un ou l'autre. votre routine de tri fait également plus de copies récursivement. – tinstaafl