Cod sursa(job #518727)

Utilizator c_sebiSebastian Crisan c_sebi Data 2 ianuarie 2011 21:36:10
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 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);
	return 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 << " ";
    g.close();
    return 0;
}