Zdravim, mam kod:
Kód:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <time.h>
using namespace std;
// Trieda Item bude predstavovat jeden prvok zoznamu.
class Item {
public:
// Hodnota prvku
int value;
// Smernik na dalsi prvok
Item* next;
// Konstruktor s 2 parametrami (ktore maju defaultne hodnoty)
Item(int value = 0, Item* next = NULL) {
this->value = value;
this->next = next;
}
// Clenska funkcia = metoda triedy. Vypise hodnotu prvku na obrazovku.
void print() {
cout << value;
}
};
// Trieda List predstavuje zretazeny zoznam.
class List {
public:
// Smernik na prvy prvok. Ak je NULL, znamena to, ze mame prazdny zoznam.
Item* first;
List() {
first = NULL;
}
List(int size, int min, int max){ //konstruktor
first = NULL;
srand(time(NULL));
for(int i = 0; i < size; i++){
push_front(min + (rand() % (max-min+1)));
}
}
~List(){ // destruktor
Item* current = first, *temp;
while (current != NULL) {
temp = current->next;
delete current;
current = temp;
}
this->first = NULL;
}
int size(){ //zistuje pocet prvkov zoznamu
int i = 0;
Item* current = first;
while(current != NULL){
i++;
current = current->next;
}
return i;
}
Item* merge(Item* first, Item* second){ //spaja dva utriedene zoznamy
Item* third;
Item* last;
if(first->value >= second->value){
third=second;
second=second->next;
last=third;
}
else{
third=first;
first=first->next;
last=third;
}
while(second != NULL && first != NULL){
if(first->value > second->value){
last->next=second;
second=second->next;
last=last->next;
}
else{
last->next=first;
first=first->next;
last=last->next;
}
}
while(first == NULL && second != NULL){
last->next=second;
second=second->next;
last=last->next;
}
while(second == NULL && first != NULL){
last->next=first;
first=first->next;
last=last->next;
}
return third;
}
Item* mergeSort(Item* prv, int velkost){
Item* second = prv;
Item* diss = prv;
int polka = velkost / 2;
if(velkost == 1 )
return prv;
for(int i=1; i <= polka; i++){
diss = second;
second=second->next;
}
diss->next = NULL;
return (merge(mergeSort(prv, polka), mergeSort(second, polka)));
}
void sort(){
int velkost = size();
this->first = mergeSort(first, velkost);
}
};
Hacik je v tom, ze mi to sorti len v pripade, ze zretazeny zoznam obsahuje pocet prvkov rovny mocnine 2 - 2, 4, 8... inak niektore prvky jednoduche "zabudne" a zaradi ich inde, vie mi niekto pomoct prosim?