#ifndef SORT_H
#define SORT_H
#include <memory>
template<typename T>
void insert_sort(T* A, const int length)
{
for(int i=1;i<length;i++)
{
int j = i-1;
T key = A[i];
while(key < A[j] && (j+1))
{
A[j+1] = A[j];
j --;
}
A[j+1] = key;
}
}
template<typename T>
T* merge(T* left, T* right, const int l_length, const int r_length)
{
T* result = new T[l_length + r_length];
int i=0,j=0,k=0;
while(i < l_length && j < r_length)
{
if(left[i] < right[j])
{
result[k++] = left[i++];
}
else
result[k++] = right[j++];
}
while (i < l_length)
{
result[k++] = left[i++];
}
while(j < r_length)
{
result[k++] = right[j++];
}
return result;
}
template<typename T>
T* merge_sort(T* A, const int length)
{
if(length <= 1)
{
return A;
}
T* left = new T[length/2];
T* right = new T[length - length/2];
int i,j;
for (i=0;i<length;i++)
{
if(i<length/2)
left[i] = A[i];
else
right[i-length/2] = A[i];
}
left = merge_sort(left,length/2);
right = merge_sort(right,(length+1)/2);
T* result = merge(left,right,length/2,length - length/2);
return result;
}
#endif