Pagini recente » Cod sursa (job #571159) | Cod sursa (job #2437173) | Cod sursa (job #2252014) | Cod sursa (job #2739268) | Cod sursa (job #1861795)
#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;
}