2
using System;

namespace MergeSortProgram
{
    class MergeSort
    {
        // Merges two subarrays of arr[]. 
        // First subarray is arr[l..m] 
        // Second subarray is arr[m+1..r] 
        public  void merge(int [] arr, int l, int m, int r)
        {
            // Find sizes of two subarrays to be merged 
            int n1 = m - l + 1;
            int n2 = r - m;

            /* Create temp arrays */
            int []L = new int[n1];
            int []R = new int[n2];


            /*Copy data to temp arrays*/
            for (int i = 0; i < n1; ++i)
            {
                L[i] = arr[l + i];
            }
            for (int j = 0; j < n2; ++j)
            {
                R[j] = arr[m + 1 + j];
            }


            /* Merge the temp arrays */

            // Initial indexes of first and second subarrays 
            int i = 0, j = 0;

            // Initial index of merged subarry array 
            int k = l;
            while (i < n1 && j < n2)
            {
                if (L[i] <= R[j])
                {
                    arr[k] = L[i];
                    i++;
                }
                else
                {
                    arr[k] = R[j];
                    j++;
                }
                k++;
            }

            /* Copy remaining elements of L[] if any */
            while (i < n1)
            {
                arr[k] = L[i];
                i++;
                k++;
            }

            /* Copy remaining elements of R[] if any */
            while (j < n2)
            {
                arr[k] = R[j];
                j++;
                k++;
            }
        }

        // Main function that sorts arr[l..r] using 
        // merge() 
        public  void sort(int [] arr, int l, int r)
        {
            if (l < r)
            {
                // Find the middle point 
                int m = (l + r) / 2;

                // Sort first and second halves 
                sort(arr, l, m);
                sort(arr, m + 1, r);

                // Merge the sorted halves 
                merge(arr, l, m, r);
            }
        }

        /* A utility function to print array of size n */
        static void printArray(int [] arr)
        {
            int n = arr.Length;
            for (int i = 0; i < n; ++i)
                Console.Write(arr[i] + " ");
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            int []arr= { 12, 11, 13, 5, 6, 7 };

           Console.WriteLine("Given Array");
            printArray(arr);
            MergeSort ps = new MergeSort();
            ps.sort(arr, 0, arr.Length - 1);

            Console.WriteLine("\nSorted array");
            printArray(arr);
        }

    }
}

The variable i and j of the for loop in the merge function giving this error. A local or parameter named 'i' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter

Any help?

Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
  • Using single letter variable names is bad practice. You should give your variables meaningful names. This might also help to reduce such errors in the future and make problems easier to spot. – jason.kaisersmith Jan 22 '20 at 14:48

1 Answers1

4

Ultimately, this can be reduced to:

for (int i = 0; i < 5; i++) { }
int i = 42;

(see your i and j around /*Copy data to temp arrays*/)

The scoping of locals is such that they can't share the same name here; so, either move some of the code to another method, or change the name of one of the locals so that you don't have two i / j in different contexts.

Alternatively, but arguably confusingly:

int i;
for (i = 0; i < 5; i++) { }
i = 42;
Marc Gravell
  • 1,026,079
  • 266
  • 2,566
  • 2,900
  • If both the variables are in the same scope than error should appear on the second i or j ie around // Initial indexes of first and second subarrays but I am getting error around /*Copy data to temp arrays*/. – Srikrishna Sharma Jan 22 '20 at 14:50
  • 1
    @SrikrishnaSharma This is because, if I'm not wrong, when you call your method, the local variable within its scope are immediatly created on the stack. No matter if they are created at the begining, the middle or the end of the method – Cid Jan 22 '20 at 14:56
  • 1
    @SrikrishnaSharma that is a subjective view; arguably, both are just as incorrect; neither is "special" - so ... I'd probably default to the first one too – Marc Gravell Jan 22 '20 at 14:58
  • @Cid That really a help – Srikrishna Sharma Jan 22 '20 at 15:16
  • @SrikrishnaSharma I'm not 100% sure about it, this is a supposition – Cid Jan 22 '20 at 15:19