// 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); }