Birləşdir Sort

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon alma Bumeranq Ticarəti Goldman Sachs Grofers microsoft Kahin Paytm Qualcomm Snapdeal Target Corporation
Bölün və fəth edin çeşidləyiciBaxılıb 21

Birləşdirmə növü nədir?

Birləşdir Sort birdir Rekursiv prosedur. Bu da a bölün və fəth edin alqoritm. İndi ayırma və fəth etmə alqoritminin nə olduğunu bilməliyik? Problemi alt problemlərə böldüyümüz və həll olunan ən qısa alt problemi tapana qədər böldüyümüz bir prosedur növüdür. Ən qısa həll olunmuş alt problemi birləşdirərək böyük / əsas problemin həllini tapırıq. Gəlin görək alqoritm birləşmə_sort üçün.

Alqoritm

Addım 1 Problemi 2 alt problemə ayırın.

Addım 2 Alt problemlər minimum ölçüyə çatana qədər rekursiv olaraq çağırılır (həll olunmuş alt problem).

Addım 3 Çözülmüş alt problemləri birləşdirin.

İndi üçün nümunəyə keçin bu alqoritmin necə işlədiyini başa düşmək?

Üçün izah Birləşdir Sort

Gəlin N sayını çeşidlənməmiş bir A massivinə sahib olaq. A = {9,1,4,2,5,3,7,2,6,17}

Birləşdir SortPin

Birləşdir SortPin

Birləşdir SortPin

Birləşdir SortPin

Birləşdir SortPin

Pin

Birləşdir SortPin

Pin

8-ci addımda finala çıxdıq sıralanmış sıra birləşmə_sort alqoritmindən istifadə etmək.

Birləşdirmə Sıralaması üçün İcra 

/*C++ Implementation of Merge Sort*/ 
#include<bits/stdc++.h>
#define max_v 100000
using namespace std;
void add_subproblems(int a[],int l,int mid,int r)
{
    int start_1=l;//starting index of subproblem 1;
    int start_2=mid+1;//strating index of subproblem 2;
    int store=l;//used to store the no in array a with O(1) space complexity. 
    /*compare the element from begining of both subproblems and choose the minimum element from them
      and increment the index wrt minimum value by 1.*/
    while(start_1<=mid&&start_2<=r)
    {
        if((a[start_1]%max_v)<=(a[start_2]%max_v))
        {
            a[store]+=(a[start_1]%max_v)*max_v;
            store++;
            start_1++;
        }
        else
        {
            a[store]+=(a[start_2]%max_v)*max_v;
            store++;
            start_2++;
        }
    }
    /*if some elements are remaining in subproblem 1*/
    while(start_1<=mid)
    {
        a[store]+=(a[start_1]%max_v)*max_v;
        store++;
        start_1++; 
    }
    /*if some elements are remaining in subproblem 2*/
    while(start_2<=r)
    {
        a[store]+=(a[start_2]%max_v)*max_v;
        store++;
        start_2++;
    }
    /*now change the elements into their oroginal values*/
    for(int i=l;i<=r;i++)
    {
        a[i]/=max_v;
    }
}
void merge(int a[],int l,int r)
{
    if(l<r)
    {
        int mid=(l+r)/2;
        merge(a,l,mid);
        merge(a,mid+1,r);
        add_subproblems(a,l,mid,r);
    }
}
int main() 
{ 
    int number;
    /*total numbers which we want to sort*/
    cin>>number;
    int a[number];
    /*take input*/
    for(int i=0;i<number;i++)
    {
        cin>>a[i];
    }
    cout<<"Array before sorting: ";
    /*print the array*/
    for(int i=0;i<number;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<"\n";
    /*call merge function*/
    merge(a,0,number-1);
    cout<<"Array after sorting: ";
    /*print the array*/
    for(int i=0;i<number;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<"\n";
    return 0; 
}
10
9 1 4 2 5 3 7 2 6 17
Array before sorting: 9 1 4 2 5 3 7 2 6 17 
Array after sorting: 1 2 2 3 4 5 6 7 9 17

Zaman mürəkkəbliyi

O (N * log N) burada N bir massivdə mövcud olan ümumi saydır. Yuxarıdakı tətbiqetmənin təkrarlanma əlaqəsi T (N) = 2 * T (N / 2) + O (1).

Kosmik Mürəkkəblik

O (1) burada verilən sıra xaricində əlavə boşluq yaratmadıq, beləliklə kosmik mürəkkəblik sabit olan O (1) -dir.

İstifadə olunan alqoritm növü

Burada birləşmə növünü həll etmək üçün bölmə və fəth etmə yanaşmasından istifadə edirik.

References

Translate »