Cod sursa(job #1861795)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 29 ianuarie 2017 12:12:15
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.59 kb
#include <cstdio>
#include <cstdlib>

FILE *in,*out;

using namespace std;

struct List{
int head;
List* tail;
};

List* emptylist = NULL;

List* prepend(int value,List* list)
{
    return new List{value,list};
}

List* greaterthan(List* list,int pivot)
{
    if(list == emptylist)
        return emptylist;
    else
    {
        if(list -> head > pivot)
        {
            return prepend(list -> head,greaterthan(list -> tail,pivot));
        }
        else
            return greaterthan(list -> tail,pivot);
    }
}

List* lowerthan(List* list,int pivot)
{
    if(list == emptylist)
        return emptylist;
    else
    {
        if(list -> head < pivot)
            return prepend(list -> head,lowerthan(list -> tail,pivot));
        else
            return lowerthan(list -> tail,pivot);
    }
}
List* equalto(List* list,int pivot)
{
    if(list == emptylist)
        return emptylist;
    else{
        if(list -> head == pivot)
            return prepend(list -> head,equalto(list -> tail, pivot));
        else
            return equalto(list -> tail,pivot);
    }
}

List* interleave(List* list1, List* list2) {
  if(list1 == emptylist) {
    return list2;
  } else if(list2 == emptylist) {
    return list1;
  } else if(list1 -> head <= list2 -> head){
    return prepend(list1 -> head, interleave(list1 -> tail,list2));
  } else {
    return prepend(list2 -> head, interleave(list1, list2 -> tail));
  }
}

int randomelement(List* list, int n = 0, int answer = 0) {
  if(list == emptylist)
    return answer;
  else {
    int randomindex = rand() % (n+1);
    if(randomindex == 0) {
      answer = list -> head;
    }
    return randomelement(list->tail, n+1, answer);
  }
}

List* quicksort(List* list)
{
    if(list == emptylist)
        return emptylist;
    int pivot;
    //pivot = randomelement(list);
    pivot = list -> head;
    List *greaterlist = greaterthan(list,pivot);
    List *lowerlist = lowerthan(list,pivot);
    List *equallist = equalto(list,pivot);
    return interleave(lowerlist,interleave(equallist,greaterlist));
}

void print(List* list)
{
    if(list != emptylist)
    {
        fprintf(out,"%d ",list -> head);
        print(list -> tail);
    }
}


int main()
{
    in = fopen("algsort.in","r");
    out = fopen("algsort.out","w");
    int n,x;
    fscanf(in,"%d",&n);
    List* list = emptylist;
    List* sortata;

    for(int i = 1;i <= n;i ++)
    {
        fscanf(in,"%d",&x);
        list = prepend(x,list);
    }
    sortata = quicksort(list);
    print(sortata);
    return 0;
}