Как и названия, мой сортировка слияния разделяет только левую сторону. Все остальное отлично работает, включая мою функцию слияния. Я не могу понять, почему. Я очень благодарен за помощь. В списке, который включает: 7, 4, 10, 2, 6, 1, 3, 7, 11, 5, выдает 1, 2, 3, 4, 6, 7, 7, 10, 11, 5Сортировка слияния не разделяет правую часть списка
EDIT: добавлена остальная часть моего класса.
#include <iostream>
#include <string>
using namespace std;
class linkedList
{
private:
class node
{
public:
int data;
node * next;
node * prev;
node(int x)
{
data = x;
next = NULL;
prev = NULL;
}
};
node * head;
node * tail;
node * split()
{
node * finger = head;
node * fast = head->next;
while (fast != NULL)
{
fast = fast->next;
if (fast != NULL)
{
fast = fast->next;
finger = finger->next;
}
}
tail = finger->next;
node * splitB = tail;
splitB->prev = NULL;
finger->next = NULL;
return splitB;
}
node * merge(node * a, node * b)
{
linkedList m;
while(a != NULL || b != NULL)
{
if(b == NULL)
{
if(m.head != NULL)
{
a->prev = m.tail;
m.tail->next = a;
m.tail = a;
}
else
{
m.head = a;
m.tail = m.head;
}
a = a->next;
}
else if(a == NULL)
{
if(m.head != NULL)
{
b->prev = m.tail;
m.tail->next = b;
m.tail = b;
}
else
{
m.head = b;
m.tail = m.head;
}
b = b->next;
}
else if (a->data < b->data)
{
if(m.head == NULL)
{
m.head = a;
m.tail = m.head;
}
else
{
a->prev = m.tail;
m.tail->next = a;
m.tail = a;
}
a = a->next;
}
else
{
if(m.head == NULL)
{
m.head = b;
m.tail = m.head;
}
else
{
b->prev = m.tail;
m.tail->next = b;
m.tail = b;
}
b = b->next;
}
}
return m.head;
}
node* mergeSort(node * a)
{
if (head == NULL || head->next == NULL)
{
return a;
}
else
{
node * b = split();
node* right = mergeSort(a);
node* left = mergeSort(b);
return merge(right, left);
}
}
public:
linkedList()
{
head = NULL;
tail = NULL;
}
void push_back(int x)
{
node * baby = new node(x);
if(head == NULL)
{
head=baby;
tail=baby;
}
else
{
baby->prev = tail;
tail->next = baby;
tail = baby;
}
}
void mergeSort()
{
head = mergeSort(head);
}
bool empty()
{
if (head == NULL)
return true;
else
return false;
}
int pop()
{
int popMe = head->data;
node * deleteMe = head;
if (head->next == NULL)
{
head = NULL;
tail = NULL;
delete deleteMe;
return popMe;
}
else
{
head = head->next;
head->prev = NULL;
delete deleteMe;
return popMe;
}
}
//test
void display()
{
node * finger = head;
while(finger!=NULL)
{
cout << finger->data << endl;
finger = finger->next;
}
}
};
Какие аномалии вы наблюдали при прохождении кода по строкам с помощью отладчика? Также предоставьте [MCVE] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, пожалуйста. –
Функция 'split()' изменяет переменную 'tail', но не объявляет ее. Где определена переменная? Возможно, это глобально?Вы рассматривали результаты переопределения значений глобальному 'tail' в рекурсивных вызовах' mergeSort() '? – CiaPan
'mergeSort()' получает указатель 'a' к сортируемому списку. Однако первое решение, принятое в функции **, вообще не зависит от 'a'! Он основан на некоторой внешней переменной 'head', которая не должна иметь ничего общего с' a' ... – CiaPan