Pagini recente » Cod sursa (job #1837960) | Cod sursa (job #674843) | Cod sursa (job #1899601) | Cod sursa (job #1886143) | Cod sursa (job #1239380)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define Nmax 500005
int v[Nmax];
int n;
int get_pivot(int l, int r){
if (r - l <= 2)
return (l + r) / 2;
int a = (rand() % (r - l + 1)) + l;
int b = (rand() % (r - l + 1)) + l;
int c = (rand() % (r - l + 1)) + l;
if (v[a] >= v[b] && v[b] >= v[c])
return b;
else if (v[b] >= v[a] && v[a] >= v[c])
return a;
return c;
}
void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void print(){
int i;
for (i = 1; i <= n; ++i)
printf("%d ", v[i]);
printf("\n");
}
void quick_sort(int l, int r){
if (r - l < 1)
return;
if (r - l == 1){
if (v[r] < v[l])
swap(&v[r], &v[l]);
return;
}
int at = get_pivot(l, r);
/* int at = (r + l) / 2; */
int p = v[at];
int i = l;
int j = r;
while (i <= j){
while (v[i] < p) ++i;
while (v[j] > p) --j;
if (i <= j){
swap(&v[i], &v[j]);
++i;
--j;
}
}
quick_sort(l, i - 1);
quick_sort(i, r);
}
int main(){
int i;
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
srand( time(NULL) );
scanf("%d", &n);
for (i = 1; i <= n; ++i)
scanf("%d", &v[i]);
quick_sort(1, n);
print();
fclose(stdin);
return 0;
}