// Algorytm Merg-sort ma na celu scalenie dwoch posortowanych tablic

            // optymistyczna złożoność jak tablice sa 12345 678910

            // pesymistyczna złożoność jak sa pomieszane 13579 246810

public                     

class Program {

 

    public static void main(String[] args)

    {

   

            int tab1[]={4};

            int tab2[]={5};

            int tab[] = {8,7,6,5,4,3,2,1,45,23,32,68,76,12,13,8};

           

            tab = Mergesort(tab,0,tab.length-1);

           

            //tab = Scalaj(tab1,tab2);

            for(int l = 0; l<tab.length; l++)

        {

            System.out.print(tab[l]+" ");

        }

           

    }

    public static int[] Scalaj(int []tab1,int []tab2){

            int tab3[]=new int[tab1.length + tab2.length];

        int i=0,j=0,k=0;

        while(i<tab1.length && j< tab2.length){ // jesli indeksy (i,j) sa w tablicach

         if(tab1[i] < tab2[j]){                               // jesli element z tab1 jest mniejszy od tego z tab

                        tab3[k] = tab1[i];                       // to do nowej tablicy wrzuc element tab1

                        i++;

            }else{

                        tab3[k] = tab2[j];                    // jesli odwrotnie to wrzuc element tab2

                        j++;

            }

            k++;

        }

       

        if(j==tab2.length){                           // jesli indeks j wyjdzie po za tablice tab2 

            for(int l = i; l < tab1.length;l++){// to

                        tab3[k]=tab1[l];                // przwpepisujemy elementy do nowej tablicy elementy z tablicy tab1

                        k++;

            }

        }else{                                              // w przeciwnym wypadku (indeks i wyjdzie po za  tablice tab1)

            for(int n = j; n < tab2.length;n++){

                        tab3[k]=tab2[n];  // to przwpepisujemy elementy do nowej tablicy elementy z tablicy tab2

                        k++;

            }

           

        }

       

        return tab3;

       

    }

    public static int[] Mergesort(int[] tab3,int p,int r){

           

           

            int tab1[] = new int[1];

            int tab2[];

           

            if(p < r){                        //sprawdza czy tsblica czy tablica nie jest równa jeden

                        int q = (p+r)/2;              //srodek tablicy

 

                        tab1 = Mergesort(tab3,p,q);   //dzieli pierwsza czesc tablcy na pol

                        tab2 = Mergesort(tab3,q+1,r); //dzieli druga czesc tablicy na pol

                       

                        tab3 = Scalaj(tab1,tab2);     //uruchomienie scalania dla tab1 i tab2

                       

            }else{

                       

                        tab1[0] = tab3[p];             //z tabicy jednoelementowej przepisuje na poczotek tab1

                        tab3=tab1;                   //

            }

           

            return tab3;

           

  

         //algorytm Insertion-Sort polega na wybraniu i  wstawienu ardumentu w odpowiednie miejsce, 

         //a dokładniej rzecz biorąc, na przesunieciu argumentu w tablicy na takie miejsce ,

         //by ciag tych argumentów był ustawiany wkolejności  rosnącej

         // algorytm ten najpeliej działa dla niewielkiej ilości argumentów w tablicy

        //najktotszy czas działnia (optymistyczny n)będzie dla wejśćowej tablicy z elementami juz posortowanymi

       //najdłuższ czas działania (pesymityczny n2)będzie dla wejśćowej tablicy posotrowanij odwrotnie

        //operacja dominująca porównywanie elementów

        int tab[] = {3,6,4,2,7,5,6,78,9,3,7,98,};

        int licznik,pom;

        for(int i = 1; i < tab.length; i++)

        {

            licznik = i;

            pom = tab[i];

            while(licznik>0 && tab[licznik-1] > pom){ // jezeli licnik jest wiekszu od zera i poprzednie wyrazenie w tablicy jest wieksze od liczb sparwdzanej

                        tab[licznik] = tab[licznik-1];       //to nastepuje zamata tych liczb

                        licznik--;                           // cofanie indeksu

            }

            tab[licznik] = pom;                      //zapisuje lioczbe sprawdzana w miejscu przeznaczenia

        }

        for(int i = 0; i<tab.length; i++)

        {

            System.out.print(tab[i]+" ");

        }*/

     

}   }