// MergeSort array of strings.
        public String[] MergeSortStrings(String[] unsortedArray, int numOfAllElementsToSort)
        {
            // Send initial progress report.
            if (sortMethodCalls == 0)
            {
                sortEventsRaised++;
                MergeSortProgress?.Invoke(this, sortMethodCalls, numOfAllElementsToSort);
            }

            // Increase global method calls counter.
            sortMethodCalls++;

            // Frequency of progress reports.
            int frequency = numOfAllElementsToSort / 5;

            if (frequency <= 0)
            {
                frequency = 1;
            }

            // Send progression reports.
            if (sortMethodCalls % frequency == 0)
            {
                sortEventsRaised++;
                MergeSortProgress?.Invoke(this, sortMethodCalls, numOfAllElementsToSort);
            }

            if (unsortedArray.Length < 2)
            {
                // Array is sorted.
                return(unsortedArray);
            }
            else
            {
                int middle = unsortedArray.Length / 2;

                String[] left  = unsortedArray.Take(middle).ToArray();
                String[] right = unsortedArray.Skip(middle).ToArray();

                left  = MergeSortStrings(left, numOfAllElementsToSort);
                right = MergeSortStrings(right, numOfAllElementsToSort);
                return(MergeStringArrays(left, right, numOfAllElementsToSort));
            }
        }
        // Helper for MergeSort array of strings.
        private String[] MergeStringArrays(String[] left, String[] right, int numOfAllElementsToSort)
        {
            // Increase global method calls counter.
            sortMethodCalls++;

            String[] sortedArray = new String[left.Length + right.Length];

            if (left.Length == 1 && right.Length == 1)
            {
                if (CompareStrings(left[0], right[0]) <= 0)
                {
                    sortedArray[0] = left[0];
                    sortedArray[1] = right[0];
                }
                else
                {
                    sortedArray[0] = right[0];
                    sortedArray[1] = left[0];
                }
            }
            else
            {
                int left_i  = 0;
                int right_i = 0;

                while (left_i < left.Length && right_i < right.Length)
                {
                    int index = Array.IndexOf(sortedArray, null);

                    if (CompareStrings(left[left_i], right[right_i]) <= 0)
                    {
                        sortedArray[index] = left[left_i];
                        left_i++;
                    }
                    else
                    {
                        sortedArray[index] = right[right_i];
                        right_i++;
                    }
                }

                if (left_i < left.Length)
                {
                    while (left_i < left.Length)
                    {
                        int index = Array.IndexOf(sortedArray, null);
                        sortedArray[index] = left[left_i];
                        left_i++;
                    }
                }

                if (right_i < right.Length)
                {
                    while (right_i < right.Length)
                    {
                        int index = Array.IndexOf(sortedArray, null);
                        sortedArray[index] = right[right_i];
                        right_i++;
                    }
                }
            }

            // Frequency of progress reports.
            int frequency = numOfAllElementsToSort / 5;

            if (frequency <= 0)
            {
                frequency = 1;
            }

            // Used to make certain of sending final progression report.
            int lastCall;

            if (numOfAllElementsToSort < 2)
            {
                lastCall = 1;
            }
            else if (numOfAllElementsToSort > 2)
            {
                lastCall = numOfAllElementsToSort * 2 + (numOfAllElementsToSort - 2);
            }
            else
            {
                lastCall = numOfAllElementsToSort * 2;
            }

            // Send progression reports.
            if (sortMethodCalls % frequency == 0 || sortMethodCalls == lastCall)
            {
                sortEventsRaised++;
                MergeSortProgress?.Invoke(this, sortMethodCalls, numOfAllElementsToSort);
            }

            return(sortedArray);
        }