T& operator[] (const int index)
{
int i = 0;
Node<T>* pointer = this->head;
while (pointer != nullptr)
{
if (i == index) {
return pointer->data;
}
else {
pointer = pointer->next;
i++;
}
}
return head->data;
}
void _merge(List<T> a, int low, int mid, int high) {
int i, j;
T* tmp = new T[high - low + 1];
int n = 0;
i = low;
j = mid + 1;
while (i <= mid && j <= high) {
if (!(a[i] < a[j])) {
tmp[n++] = a[i++];
}
else {
tmp[n++] = a[j++];
}
}
while (i <= mid) {
tmp[n++] = a[i++];
}
while (j <= high) {
tmp[n++] = a[j++];
}
for (i = 0; i < n; i++) {
a[low++] = tmp[i];
}
delete[] tmp;
}
void merge_sort(List<T> a, int n) {
int seg = 1;
int index;
while (seg < n) {
index = 0;
while (index <= n - seg * 2) {
_merge(a, index, index + seg - 1, index + seg * 2 - 1);
index += seg * 2;
}
if (index + seg < n) {
_merge(a, index, index + seg - 1, n - 1);
index += seg * 2;
}
seg += seg;
}
}