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);
            }
        }
Exemple #2
0
        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);
                }
            }
        }