예제 #1
0
        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);
                    }
                }
            }
        }
예제 #2
0
        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++];
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
            }
        }
예제 #5
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);
                }
            }
        }