예제 #1
0
        public static void TestTwice()
        {
            List <int> array = new List <int>();

            for (int i = 0; i < 10000; i++)
            {
                array.Add((i * 43) % 983);
            }

            MergeSorter sorter = new MergeSorter(array, 1);

            sorter.MergeSort();
            sorter.MergeSort();

            for (int i = 1; i < 10000; i++)
            {
                Assert.LessOrEqual(array[i - 1], array[i]);
            }
        }
예제 #2
0
        public static void TestSingle()
        {
            List <int> array = new List <int>();

            array.Add(42);

            MergeSorter sorter = new MergeSorter(array, 1);

            sorter.MergeSort();

            Assert.AreEqual(array[0], 42);
        }
예제 #3
0
        public static void TestCouple()
        {
            List <int> array = new List <int>();

            array.Add(123);
            array.Add(-42);

            MergeSorter sorter = new MergeSorter(array, 1);

            sorter.MergeSort();

            Assert.AreEqual(array[0], -42);
            Assert.AreEqual(array[1], 123);
        }
예제 #4
0
        public static void TestEqual()
        {
            List <int> array = new List <int>();

            for (int i = 0; i < 100; i++)
            {
                array.Add(-4242);
            }

            MergeSorter sorter = new MergeSorter(array, 1);

            sorter.MergeSort();

            for (int i = 0; i < 100; i++)
            {
                Assert.AreEqual(array[i], -4242);
            }
        }
예제 #5
0
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                PrintUsage();
                return;
            }

            int depth;

            if (!Int32.TryParse(args[0], out depth))
            {
                PrintUsage();
                return;
            }

            if (depth <= 1)
            {
                PrintUsage();
                return;
            }

            List <int> array = new List <int>();

            for (int i = 0; i < 100; i++)
            {
                array.Add(i % 23);
            }

            MergeSorter sorter = new MergeSorter(array, depth - 1);

            sorter.MergeSort();

            for (int i = 0; i < array.Count; i++)
            {
                Console.Write(array[i] + " ");
            }
            Console.WriteLine();
        }
예제 #6
0
        public void MergeSort()
        {
            int size = right - left;

            if (size == 0 || size == 1)
            {
                return;
            }

            int firstSize  = size / 2;
            int secondSize = size - firstSize;

            int firstLeft  = left;
            int firstRight = left + firstSize;

            int secondLeft  = left + firstSize;
            int secondRight = right;

            MergeSorter firstSorter  = new MergeSorter(array, depth - 1, firstLeft, firstRight, buffer);
            MergeSorter secondSorter = new MergeSorter(array, depth - 1, secondLeft, secondRight, buffer);

            if (depth > 0)
            {
                Thread firstThread  = new Thread(firstSorter.MergeSort);
                Thread secondThread = new Thread(secondSorter.MergeSort);
                firstThread.Start();
                secondThread.Start();
                firstThread.Join();
                secondThread.Join();
            }
            else
            {
                firstSorter.MergeSort();
                secondSorter.MergeSort();
            }

            int first  = 0;
            int second = 0;

            for (int i = 0; i < size; i++)
            {
                if (first == firstSize)
                {
                    buffer[left + i] = array[secondLeft + second++];
                    continue;
                }
                if (second == secondSize)
                {
                    buffer[left + i] = array[firstLeft + first++];
                    continue;
                }
                if (array[firstLeft + first] <= array[secondLeft + second])
                {
                    buffer[left + i] = array[firstLeft + first++];
                }
                else
                {
                    buffer[left + i] = array[secondLeft + second++];
                }
            }

            for (int i = 0; i < size; i++)
            {
                array[left + i] = buffer[left + i];
            }
        }