public static void Sort(string[] arr, bool reverse = false) { Console.WriteLine( $"\nTime Complexity: \n- Best: O(n) \n- Worst: O(n\xB2) " + $"\nSpace Complexity: \n- Worst O(1) \n"); var n = arr.Length; for (var i = 1; i < n; i++) { // Swap the elements in 'less' to reverse the sort if (!reverse) // MinSort { for (var j = i; j > 0 && Utils.Less(arr[j], arr[j - 1]); j--) { Utils.Swap(arr, j, j - 1); } } else // MaxSort { for (var j = i; j > 0 && Utils.Less(arr[j - 1], arr[j]); j--) { Utils.Swap(arr, j, j - 1); } } } }
private static void MergeArrays(string[] arr, int low, int mid, int high) { // Merges arr[low... mid] with arr[mid+1... high] var i = low; var j = mid + 1; for (var k = low; k <= high; k++) { // Copy arr to _temp _temp[k] = arr[k]; } for (var k = low; k <= high; k++) { // Merge if (i > mid) { arr[k] = _temp[j++]; } else if (j > high) { arr[k] = _temp[i++]; } else if (Utils.Less(_temp[j], _temp[i])) { arr[k] = _temp[j++]; } else { arr[k] = _temp[i++]; } } }
private static int Partition(string[] arr, int left, int right) { var pivot = arr[right]; var i = left - 1; // Starting from last element -1 for (var j = left; j < right; j++) { // If the current element is small then // the pivot, increment i and swap(i, j) if (Utils.Less(arr[j], pivot)) { i++; Utils.Swap(arr, i, j); } } // swap arr[i+1] and arr[high] (or pivot) Utils.Swap(arr, i + 1, right); return(i + 1); }
private static void SiftDown(string[] arr, int n, int i) { var p = i; // Parent var l = i * 2 + 1; // Left-child var r = i * 2 + 2; // Right-child if (l < n && Utils.Less(arr[p], arr[l])) { p = l; } if (r < n && Utils.Less(arr[p], arr[r])) { p = r; } if (i != p) { Utils.Swap(arr, i, p); SiftDown(arr, n, p); } }
public static void Sort(string[] arr, bool reverse = false) { Console.WriteLine( $"\nTime Complexity: \n- Best: O(n\xB2) \n- Worst: O(n\xB2) " + $"\nSpace Complexity: \n- Worst O(1) \n"); var n = arr.Length; for (var i = 0; i < n - 1; i++) // Current min { var pointer = i; for (var j = i + 1; j < n; j++) // Current item // Swap the elements in 'less' to reverse the sort { if (!reverse) // MinSort { if (Utils.Less(arr[j], arr[pointer])) { pointer = j; } } else // MaxSort { if (Utils.Less(arr[pointer], arr[j])) { pointer = j; } } } if (pointer != i) { Utils.Swap(arr, i, pointer); } } }