#include <iostream>
using namespace std;
void sort(int *array, int size)
{
int *l_array;
int l_size = 0;
int *r_array;
int r_size = 0;
// jednoelementowa tablica jest posortowana więc nie ma potrzeby niczego z nią robić
if(size > 1)
{
l_size = size / 2;
r_size = size - size / 2;
l_array = new int[l_size];
r_array = new int[r_size];
// utworzylimy nowe tablice lewą i prawą które będą reukrencyjnie sortowane
// posortowane tablice będą zwrócone przez referencję
// nowym tablicą musimy przypisać wartosci (jesczze nie posrotwane)
for(int i = 0, li = 0, ri = 0; i < size; i++)
if(i < l_size)
l_array[li++] = array[i];
else
r_array[ri++] = array[i];
//teraz sortujemy nasze małe tablice
sort(l_array, l_size);
sort(r_array, r_size);
//teraz w l_array oraz r_array mamy posortowane liczby
//wiec laczymy te dwe tablice i zapisujemy do sortowanej tablicy
//liczniki indeksow laczonych tablic zapisujemy globalnie
//po to by wiedziec potem ktora liste ewentualnie trzeba przepisac do konca
//tak samo licznik sortowanej tablicy po to by wiedziec od ktorego elementu
//zaczac zapisywanie
//nawenictwo takie samo jak wyzej (L)eft(i), czyli zmeinna i dla lewej tabicly
//to samo tyczy sie prawej
int i = 0;
int li =0, ri = 0;
for(; i < size && li < l_size && ri < r_size; i++)
if(l_array[li] < r_array[ri])
array[i] = l_array[li++]; //zwiekszamy li bo zapisalismy ta liczbe
else
array[i] = r_array[ri++];
//teraz przepisujemy pozostala czesc ktorejs listy
//nejpierw lewa, o ile jest taka potrzeba
for(;i < size && li < l_size; i++)
array[i] = l_array[li++];
//teraz prawa tablica
for(;i < size && ri < r_size; i++)
array[i] = r_array[ri++];
//czyscimy pamiec
delete[] l_array;
delete[] r_array;
}
//zwracamy przez referencje
}
int main() {
int to_sort[] = {1, 0, -4, 5, 7, 6, 3};
sort(to_sort, 7);
for(int i = 0; i < 7; i++)
cout << to_sort[i] << ", ";
return 0;
}