Ejemplo n.º 1
0
        static void Main()
        {
            int[] arrayToInsertionSort = Utils.CreateRandomArray(10, 1000);
            int[] arrayToQuickSort     = Utils.CreateRandomArray(10, 1000);
            int[] arrayToMergeSort     = Utils.CreateRandomArray(10, 1000);

            Console.WriteLine("--------------------------------------------------");
            Console.WriteLine("Неотсортированный массив для сотрировки вставками:");
            Utils.Display(arrayToInsertionSort);
            Console.WriteLine("Неотсортированный массив для быстрой сортировки :");
            Utils.Display(arrayToQuickSort);
            Console.WriteLine("Неотсортированный массив для сортировки слиянием:");
            Utils.Display(arrayToMergeSort);
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("\n");

            InsertionSort.DoInsertionSort(arrayToInsertionSort, 0, arrayToInsertionSort.Length - 1);
            QuickSort.DoQuickSort(arrayToQuickSort, 0, arrayToQuickSort.Length - 1);
            MergeSort.DoMergeSort(arrayToMergeSort, 0, arrayToMergeSort.Length - 1);

            Console.WriteLine("-----------------------------------------------");
            Console.WriteLine("Отсортированный массив для сотрировки вставками:");
            Utils.Display(arrayToInsertionSort);
            Console.WriteLine("Отсортированный массив для быстрой сортировки :");
            Utils.Display(arrayToQuickSort);
            Console.WriteLine("Отсортированный массив для сортировки слиянием:");
            Utils.Display(arrayToMergeSort);
            Console.WriteLine("-----------------------------------------------");
            Console.WriteLine("\n");

            SortMethod sortMethod   = QuickSort.DoQuickSort;
            double     timeForQuick = Utils.CountTimeForManySorts(100, 100000, 1000000, sortMethod);

            Console.WriteLine("Для быстрой сортировки:");
            Console.WriteLine($"Время: {timeForQuick}\n");


            sortMethod = MergeSort.DoMergeSort;
            double timeForMerge = Utils.CountTimeForManySorts(100, 100000, 1000000, sortMethod);

            Console.WriteLine("Для сортировки слиянием:");
            Console.WriteLine($"Время: {timeForMerge}\n");


            Console.WriteLine("-----------------------------------------------");
            Console.WriteLine("Для гибридной быстрой сортировки:");
            SortHybridMethod sortHybridMethod = QuickSort.DoHybridQuickSort;

            (int optimalQuickSortK, double timeForQuickSortK) = Utils.FindOptimalElement(100, 100000, 1000000, sortHybridMethod);
            Console.WriteLine($"Оптимальное k: {optimalQuickSortK}\nВремя: {timeForQuickSortK}\n");


            Console.WriteLine("-----------------------------------------------");
            Console.WriteLine("Для гибридной сортировки слиянием:");
            sortHybridMethod = MergeSort.DoHybridMergeSort;
            (int optimalMergeSortK, double timeForMergeSortK) = Utils.FindOptimalElement(100, 100000, 1000000, sortHybridMethod);
            Console.WriteLine($"Оптимальное k: {optimalMergeSortK}\nВремя: {timeForMergeSortK}\n");
        }
Ejemplo n.º 2
0
        public void TestSort(int[] input, int[] expected)
        {
            InsertionSort sorter = new InsertionSort();

            //Act
            sorter.DoInsertionSort(input);

            //Assert
            for (int i = 0; i < input.Length; i++)
            {
                Assert.AreEqual(expected[i], input[i]);
            }
        }
Ejemplo n.º 3
0
 public static void DoHybridQuickSort(int[] array, int leftIndex, int rightIndex, int k)
 {
     if (rightIndex - leftIndex + 1 <= k)                             //3    4?
     {
         InsertionSort.DoInsertionSort(array, leftIndex, rightIndex); //1
         return;                                                      //1
     }
     if (leftIndex < rightIndex)                                      //1     2?
     {
         int middleIndex = FindBorder(array, leftIndex, rightIndex);  //3
         DoHybridQuickSort(array, leftIndex, middleIndex, k);         //1
         DoHybridQuickSort(array, middleIndex + 1, rightIndex, k);    //1
     }
 }
Ejemplo n.º 4
0
        public static void DoHybridMergeSort(int[] array, int leftIndex, int rightIndex, int k)
        {
            if (rightIndex - leftIndex + 1 <= k)                             //3    4?  if
            {
                InsertionSort.DoInsertionSort(array, leftIndex, rightIndex); //1
                return;                                                      //1
            }

            if (leftIndex < rightIndex)                                   //1    2?  if
            {
                int middleIndex = (leftIndex + rightIndex) / 2;           //4
                DoHybridMergeSort(array, leftIndex, middleIndex, k);      //1
                DoHybridMergeSort(array, middleIndex + 1, rightIndex, k); //1
                DoMerge(array, leftIndex, middleIndex, rightIndex);       //1
            }
        }
Ejemplo n.º 5
0
        //Всё как в MergeSort, только при определённом размере массива вместо рекурсивного вызова вызывается InsertionSort
        public static void DoMergeHybridSort(int[] array, int start, int end, int k)
        {
            if (end - start + 1 <= k)
            {
                InsertionSort.DoInsertionSort(array, start, end);
                return;
            }

            if (start < end)
            {
                int border = (start + end) / 2;
                // Делаем merge для левой и правой части
                DoMergeHybridSort(array, start, border, k);
                DoMergeHybridSort(array, border + 1, end, k);
                // Склейка в один массив
                DoMerge(array, start, border, end);
            }
        }