Pagini recente » Cod sursa (job #3290526) | Cod sursa (job #2654818) | Cod sursa (job #3138088) | Cod sursa (job #2328389) | Cod sursa (job #2273878)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void quickSort(int, int, int *);
int getMiddle(int, int, int, int*);
int main() {
FILE *f, *g;
f = freopen("algsort.in", "r", stdin);
g = freopen("algsort.out", "w", stdout);
int n;
scanf("%d", &n);
int *v = malloc(n * sizeof(int) );
int i;
for (i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
srand(time(NULL));
quickSort(0, n - 1, v);
for (i = 0; i < n; ++i) {
printf("%d ", v[i]);
}
return 0;
}
void quickSort(int left, int right, int *v) {
int i = left;
int j = right;
int rand1 = rand() % (right - left + 1) + left;
int rand2 = rand() % (right - left + 1) + left;
int rand3 = rand() % (right - left + 1) + left;
int pivot = getMiddle(rand1, rand2, rand3, v);
while ( i <= j ) {
while (v[i] < pivot) {
i ++;
}
while (v[j] > pivot) {
j --;
}
if (i <= j) {
int aux = v[i];
v[i] = v[j];
v[j] = aux;
i ++;
j --;
}
}
if (i < right) quickSort(i, right, v);
if (j > left) quickSort(left, j, v);
}
int getMiddle(int x, int y, int z, int *v) {
if (v[x] <= v[y] && v[x] <= v[z]) {
return ( (v[y] < v[z]) ? v[y]:v[z] );
}
if (v[y] <= v[x] && v[y] <= v[z]) {
return ( (v[x] < v[z]) ? v[x]:v[z]);
}
if (v[z] <= v[x] && v[z] <= v[y]) {
return ( (v[x] < v[y]) ? v[x]:v[y] );
}
}