сортировка слиянием на месте | C #

Я написал программу для сортировки слиянием, и программа работает нормально до тех пор, пока в точке слияния она не сливается должным образом.

например, Пример:

mergesort.in: // все числа - это один массив и не использовать временный массив для сортировки

  • 2 // -> Это номер массива
  • 5 // -> Это массив (следующая строка) Длина
  • 4 6 98 8 24
  • 8 // -> Это массив (следующая строка) Длина
  • 12 14 89 21 4 7 9 41

mergesort.Out:

  //Output in file mergesort.Out 
  • 4 6 8 24 98
  • 4 7 9 12 14 21 41 89

Я не понимаю, как работать с функцией mergeArray для сортировки слиянием на месте

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ConsoleApplication1
    {
        class ReadFromFile
        {
            static void Main()
            {
                ArrayList lines = new ArrayList();

            var input = System.IO.File.ReadAllLines(@"C:\mergesort.in");

            System.Console.WriteLine("Contents of mergesort.in = ");

            foreach (string line in input)
            {
                Console.WriteLine("\t" + line);
            }
            foreach (var i in input)
            {
                if (Convert.ToInt32(i.Length) > 1)
                {
                    var counter = 0;
                    foreach (var item in input)
                    {
                        if (input[counter].Length > 1)
                        {
                            string[] t = input[counter].Split(' ');
                            foreach (string word in t)
                            {
                                lines.Add(word);
                            }
                            ReadFromFile.mergesort(t, 0, 5, lines);
                        }
                        counter++;
                    }

                    foreach (string line in lines)
                    {
                        Console.WriteLine("\t" + line);
                    }
                    break;
                }
            }

            Console.WriteLine("Press any key to exit...");
            System.Console.ReadKey();
        }

        private static void mergesort(string[] t, int p1, int p2, ArrayList lines)
        {
            if (p1 < p2)
            {
                int mid = (p2 + p1) / 2;
                ReadFromFile.mergesort(t, p1, mid, lines);
                Console.WriteLine(p1);

                ReadFromFile.mergesort(t, mid + 1, p2, lines);
                Console.WriteLine(t);
                foreach (var item in t)
                {
                    Console.WriteLine(item);
                }
                ReadFromFile.mergeArray(t, p1, mid, p2, lines);
            }
        }

        private static void mergeArray(string[] arr, int start, int mid, int end, ArrayList lines)
        {

            //I'm not understand how to work this function for in-place merge Sort

        }
    }
}

person mail temp    schedule 24.06.2014    source источник
comment
Я не совсем понимаю, что вы хотите сделать ... что с 2, 5 - где они у вас на выходе? почему вы делите вывод на две группы? расскажите подробнее ...   -  person AsfK    schedule 24.06.2014
comment
и, конечно же, вы можете найти материал о сортировке слиянием в Интернете, link1: en.wikipedia.org/wiki/Merge_sort link2: sorting-algorithms.com/merge-sort   -  person AsfK    schedule 24.06.2014
comment
Сортировка массива на месте возможна, но сложна. Я почти уверен, что ты действительно не хочешь этого делать. См. stackoverflow.com/questions/2571049/ по причинам, почему.   -  person Jim Mischel    schedule 24.06.2014
comment
@AsfK добавить больше комментариев в исходный контент и 2 в номер массива и 5 в следующий размер массива   -  person mail temp    schedule 24.06.2014
comment
@JimMischel, я вижу этот пост и не отвечаю на свой вопрос (и я не понимаю). Спасибо, что добавили Commnet.   -  person mail temp    schedule 24.06.2014
comment
Какой у Вас вопрос? Если вы спрашиваете, как выполнить слияние на месте, я предлагаю вам не пробовать его. В этом суть ссылки, которую я предоставил. Для сортировки слиянием обычно требуется вторичный массив, который я предлагаю вам использовать.   -  person Jim Mischel    schedule 24.06.2014
comment
Мне нужен код для языка C #, и я не понимаю ссылки. что мне исправить функцию mergeArray. Спасибо.   -  person mail temp    schedule 24.06.2014
comment
Вы действительно хотите сортировку слиянием на месте или просто возвращать отсортированные данные в том же массиве?   -  person Pete Kirkham    schedule 24.06.2014
comment
@PeteKirkham, я хочу сортировку слиянием на месте. Спасибо.   -  person mail temp    schedule 24.06.2014
comment
Затем прочтите статью Катаянена (ссылка AsfK) и разработайте ее. Здесь нет ответа, который можно было бы написать без месяцев усилий, и вы не объяснили, зачем вам нужна сортировка на месте.   -  person Pete Kirkham    schedule 25.06.2014


Ответы (1)


Было бы намного проще, если бы вы использовали Linq:

foreach (var line in input)
{
    var elements = line.Split(' ');

    if (elements.Count > 1)
    {
        var t = elements
            .Select(i => Convert.ToInt32(i))
            .Distinct()
            .OrderBy(i => i)
            .Select(i => i.ToString())
            .ToArray();

        Console.WriteLine("\t" + string.Join(" ", t));
    }
}

Используйте .Union, если вы хотите объединить уникальные значения из более чем одного массива

person Lee Greco    schedule 24.06.2014
comment
Этот вопрос касается алгоритма сортировки слиянием. - person JLRishe; 24.06.2014