Cod sursa(job #518701)

Utilizator c_sebiSebastian Crisan c_sebi Data 2 ianuarie 2011 20:22:16
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>

using namespace std;

struct Node{
	int val;
	Node *next;
};


Node* middle(Node *p){
	if(!p || !p->next) return p;
Node *q = p;
	while(!q->next && !q->next->next){
		q = q->next->next;
p = p->next;
}
Node *mid = p->next;
p->next = NULL;
return mid;
}

Node* merge(Node *p, Node *q){
if(!p) return q;
if(!q) return p;
Node *head = NULL, *tail = NULL;
if(p->val <= q->val)
	head  = p, p = p->next;
else head = q, q = q->next;
tail = head;
tail->next = NULL;

while(p && q){
if(p->val <= q->val){
tail->next = p;
tail = p;
p = p->next;
} else{
tail->next = q;
tail = q;
q = q->next;
}
 		tail->next = NULL;	
	}
	if(p) tail->next = p;
	else tail->next = q;
	return head;
}

Node* mergesort(Node *p){
	if(!p || !p->next) return p;
	
	Node *mid = middle(p);
	Node *p1 = mergesort(p);
	Node *p2 = mergesort(mid);
	merge(p1, p2);
}


int main(){
	ifstream f("algsort.in");
	ofstream g("algsort.out");
	int n, val;
	Node *head = NULL, *tail = NULL, *p;
	f >> n;
	for(int i  = 0; i < n; ++i){
		f >> val;
		p = new Node;
		p->val = val;
		p->next = NULL;
		if(!head){
			head = tail = p;
		} else 
tail->next = p;
tail = p;
}
}
head = mergesort(head);
for(p = head; !p; p = p->next)
	g << p->val << " ";
return 0;
}