DEV Community

Cover image for Merge Sort Implementation
bappasaha
bappasaha

Posted on

Merge Sort Implementation

[code in cpp](https://github.com/bappasahabapi/Algorithm.cpp/blob/master/Basic%20Data%20Structure-C%2B%2B/week-2/01-Merge-sort.cpp)**

[code in js]
(https://github.com/bappasahabapi/Algorithm.cpp/blob/master/Basic%20Data%20Structure-C%2B%2B/week-2/02-Merge-srot.js)

Merge Sort:divide and conquer algorithm

 01.First handle the base case;
 02. we have a loop which continues 0 to mid-1;
 03. Next divide the vector into two parts: vector b and vector c;
 04. Next we have sorted vector(means divide steps);
 05. Next the conquer steps
Enter fullscreen mode Exit fullscreen mode

Best Case :

    [] --> []
    [a] --> [a]
Enter fullscreen mode Exit fullscreen mode

🎄 Implementation:

🔘 Divide part

🔥 It takes a vector input and return a vector output

       #include<bits/stdc++.h>
       using namespace std;
        vector<int> merge_sort(vector<int>a){

        }
Enter fullscreen mode Exit fullscreen mode

🔥 next define the base case inside the vector

if array size is 0 or 1 then return the array

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }
        }
Enter fullscreen mode Exit fullscreen mode

🔥 otherwise we divide the array at the midpoint

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;
        }
Enter fullscreen mode Exit fullscreen mode

🔥 divide the vector into two parts

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            // divide the vector into two parts
            vector<int>b;
            vector<int>c;
        }
Enter fullscreen mode Exit fullscreen mode

🔥 Divide the vector into two parts vector b and c where a=b+c

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;
        }
Enter fullscreen mode Exit fullscreen mode

🔥 Divide the array into two parts if even then size of b = size of c otherwise

vector b starts with 0 to mid and vector c element start mid to i<a.size()

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;

            for(int i=0;i<mid;i++)
                b.push_back(a[i]);

            for(int i=mid;i<a.size();i++)
                c.push_back(a[i]);
        }
Enter fullscreen mode Exit fullscreen mode

🔥 Next we call the two child array b and c

 here a get the sorted b elements
and a also get the sorted c elements
Enter fullscreen mode Exit fullscreen mode
        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;

            for(int i=0;i<mid;i++)
                b.push_back(a[i]);

            for(int i=mid;i<a.size();i++)
                c.push_back(a[i]);

            //  now we get two sortd vector
            // This is divide steps
            vector<int>sorted_b=merge_sort(b);
            vector<int>sorted_c=merge_sort(c);


        }
Enter fullscreen mode Exit fullscreen mode

Conquer part

🔥 Store the two sorted array into vector a

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;

            for(int i=0;i<mid;i++)
                b.push_back(a[i]);

            for(int i=mid;i<a.size();i++)
                c.push_back(a[i]);

            //  now we get two sortd vector
            // This is divide steps
            vector<int>sorted_b=merge_sort(b);
            vector<int>sorted_c=merge_sort(c);

            // return sorted array is stored in vector a
            vector<int> sorted_a;


        }
Enter fullscreen mode Exit fullscreen mode

🔥 Next we take two index and both are pointed in index 0

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;

            for(int i=0;i<mid;i++)
                b.push_back(a[i]);

            for(int i=mid;i<a.size();i++)
                c.push_back(a[i]);

        //  now we get two sortd vector
        // This is divide steps
            vector<int>sorted_b=merge_sort(b);
            vector<int>sorted_c=merge_sort(c);

        // return sorted array is stored in vector a
            vector<int> sorted_a;

         // Next we take two index and both are pointed in index 0
            int idx1 =0;
            int idx2 =0;


        }
Enter fullscreen mode Exit fullscreen mode

🔥 next the loop will run the vector size of a ;

        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;

            for(int i=0;i<mid;i++)
                b.push_back(a[i]);

            for(int i=mid;i<a.size();i++)
                c.push_back(a[i]);

            //  now we get two sortd vector
            // This is divide steps
            vector<int>sorted_b=merge_sort(b);
            vector<int>sorted_c=merge_sort(c);

            // return sorted array is stored in vector a
            vector<int> sorted_a;

         // Next we take two index and both are pointed in index 0
            int idx1 =0;
            int idx2 =0;

    // next the loop will run the vector size of a;
            for(int i=0;i<a.size();i++)
            {
                if(sorted_b[idx1]<sorted_c[idx2])
                {
                    sorted_a.push_back(sorted_b[idx1]);
                    idx1++;
                }
                else
                {
                    sorted_a.push_back(sorted_c[idx2]);
                    idx2++;
                }
            }


        }
Enter fullscreen mode Exit fullscreen mode

🔥 Next check the corner case
That means we the index is reach the last element then we store the other array element .

🔥 next the loop will run the vector size of a ;

        #include<bits/stdc++.h>
        using namespace std;
        vector<int> merge_sort(vector<int>a)
        {
            if(a.size()<=1){
                return a;
            }

            int mid =a.size()/2;

            vector<int>b;
            vector<int>c;

            for(int i=0;i<mid;i++)
                b.push_back(a[i]);

            for(int i=mid;i<a.size();i++)
                c.push_back(a[i]);

            //  now we get two sortd vector
            // This is divide steps
            vector<int>sorted_b=merge_sort(b);
            vector<int>sorted_c=merge_sort(c);

            // return sorted array is stored in vector a
            vector<int> sorted_a;

         // Next we take two index and both are pointed in index 0
            int idx1 =0;
            int idx2 =0;

    // next the loop will run the vector size of a;
            for(int i=0;i<a.size();i++)
            {
                //corner case
                if(idx1==sorted_b.size())
                {
                            sorted_a.push_back(sorted_c[idx2]);
                            idx2++;
                }
                else if(idx2==sorted_c.size())
                {
                            sorted_a.push_back(sorted_b[idx1]);
                            idx1++;
                }


                if(sorted_b[idx1]<sorted_c[idx2])
                {
                    sorted_a.push_back(sorted_b[idx1]);
                    idx1++;
                }
                else
                {
                    sorted_a.push_back(sorted_c[idx2]);
                    idx2++;
                }
            }

            return sorted_a;

        }

        int main()
        {
            vector<int> a={5,3,7,1,8,9};
            vector<int>ans =merge_sort(a);
            for(int i=0;i<ans.size();i++)
                cout<<ans[i]<<" ";


            return 0;
        }
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
bappasahabapi profile image
bappasaha

The whole code is here :

/*
complexity of merge sort : O(n*log n)
01.First handle the base case;

  1. we have a loop which continues 0 to mid-1;
  2. Next divide the vector into two parts: vector b and vector c;
  3. Next we have sorted vector(means divide steps);
  4. Next the conqure steps */ #include // #include // #include // #include using namespace std;

vectormerge_sort(vectorans)
{

//base case
if(ans.size()<=1)
    return ans;

// divide the vector into two parts
vector<int>Left;
vector<int>Right;

// we divide ans vector into two parts . here midPoint means where I divide the vector.
int midPoint =ans.size()/2;


// we have a loop which continues 0 to mid-1 porjonto to left e pathabo and mid theke n-1 size porjonto right e pathabo 
// left vage left gulo gelo , right e right gulo gelo

for(int i=0;i<midPoint;i++)
   Left.push_back(ans[i]);

for(int i=midPoint;i<ans.size();i++)
    Right.push_back(ans[i]);

// ekhon left half er jonno and right half er jonno ans ber korbo. eita bar korar jonno amra function takei call diye dibo
// now we get two sortd vector
// This is divide steps
vector<int>sorted_Left=merge_sort(Left);
vector<int>sorted_Right=merge_sort(Right);

//conqure steps: 
vector<int>sorted_ans;
int left_index=0;
int right_index=0;

for(int i=0; i<ans.size();i++)
{

    // check the corner case
    if(left_index==sorted_Left.size())
    {
        sorted_ans.push_back(sorted_Right[right_index]);
        right_index++;
    }
    else if(right_index==sorted_Right.size())
    {
        sorted_ans.push_back(sorted_Left[left_index]);
        left_index++;
    }
    //-----
        //todo: for acceding order
    else if(sorted_Left[left_index]<sorted_Right[right_index])
    {
        sorted_ans.push_back(sorted_Left[left_index]);
        left_index++;
    }
    //todo: for decending order
    // else if(sorted_Left[left_index]>sorted_Right[right_index])
    // {
    //     sorted_ans.push_back(sorted_Left[left_index]);
    //     left_index++;
    // }
    else
    {
        sorted_ans.push_back(sorted_Right[right_index]);
        right_index++;
    }

}
return sorted_ans;
Enter fullscreen mode Exit fullscreen mode

}

int main()
{
vector a={5,3,7,1,8,9};
vectorans =merge_sort(a);
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<" ";

return 0;
Enter fullscreen mode Exit fullscreen mode

}