int quicksort1(int* IntegerArray, int start, int end) { nbComp = nbComp + end - start; int pivot = IntegerArray[start]; int position; int tmp, l_i, r_i; int left, right; if (start >= end) { return start; } l_i = start; for (r_i = start; r_i < end; r_i++) { if (IntegerArray[r_i + 1] < pivot) { tmp = IntegerArray[l_i + 1]; IntegerArray[l_i + 1] = IntegerArray[r_i + 1]; IntegerArray[r_i + 1] = tmp; l_i = l_i + 1; } } tmp = pivot; IntegerArray[start] = IntegerArray[l_i]; IntegerArray[l_i] = tmp; left = quicksort1(IntegerArray, start, l_i - 1); right = quicksort1(IntegerArray, l_i + 1, end); position = l_i; return position; }
int main(int argc, char** argv) { int tamano, i, j, ret; int* perm = NULL; srand(time(NULL)); if (argc != 3) { fprintf(stderr, "Error en los parametros de entrada:\n\n"); fprintf(stderr, "%s -tamanio <int> -numP <int>\n", argv[0]); fprintf(stderr, "Donde:\n"); fprintf(stderr, " -tamanio : numero elementos permutacion.\n"); return -1; } printf("Practica numero 2, apartado 4\n"); printf("Realizada por: Ari Handler Gamboa y Adrian Lorenzo Mateo\n"); printf("Grupo: 261\n\n"); /* comprueba la linea de comandos */ for(i = 1; i < argc; i++) { if (strcmp(argv[i], "-tamanio") == 0) { tamano = atoi(argv[++i]); } else { fprintf(stderr, "Parametro %s es incorrecto\n", argv[i]); } } perm = genera_perm(tamano); if (perm == NULL) { /* error */ printf("Error: No hay memoria\n"); exit(-1); } printf("\nPermutacion desordenada:\n"); for(j = 0; j < tamano; j++) { printf("%d \t", perm[j]); } printf("\n"); ret = quicksort1(perm, 0, tamano-1); if (ret == ERR) { printf("Error: Error en Quicksort1\n"); free(perm); exit(-1); } printf("\nPermutacion ordenada:\n"); for(j = 0; j < tamano; j++) { printf("%d \t", perm[j]); } printf("\n"); free(perm); return 0; }
static void timer() { int i; for (i = 1000000; i < 100000001; i *= 2) { int size = sizeof(int) * i; int *tmp = malloc(size); if (tmp == NULL ) { fatal("tmp malloc failed."); } int *data = malloc(size); if (data == NULL ) { fatal("data malloc failed."); } random(tmp, i); memcpy(data, tmp, size); unsigned long count = 0; clock_t start = clock(); quicksort1(data, i); timeinfo("quicksort1", i, count, clock() - start); memcpy(data, tmp, size); start = clock(); quicksort2(data, i); timeinfo("quicksort2", i, count, clock() - start); memcpy(data, tmp, size); start = clock(); quicksort3(data, i); timeinfo("quicksort3", i, count, clock() - start); memcpy(data, tmp, size); start = clock(); quicksort4(data, i); timeinfo("quicksort4", i, count, clock() - start); memcpy(data, tmp, size); start = clock(); quicksort5(data, i); timeinfo("quicksort5", i, count, clock() - start); memcpy(data, tmp, size); start = clock(); quicksort6(data, i); timeinfo("quicksort6", i, count, clock() - start); memcpy(data, tmp, size); start = clock(); quicksort7(data, i); timeinfo("quicksort7", i, count, clock() - start); free(data); free(tmp); printf("\n"); } }
unsigned long long int countComp(int* IntegerArray, int start, int end) { int position; position = quicksort1(IntegerArray, start, end); return nbComp; }
void cut2S(int N, int M) { int I, J; // indices void *AI, *AJ; // array values Loop: if ( M - N <= cut2SLimit ) { quicksort1(N, M); return; } // Check for duplicates int sixth = (M - N + 1) / 6; int e1 = N + sixth; int e5 = M - sixth; int e3 = (N+M) / 2; // The midpoint int e4 = e3 + sixth; int e2 = e3 - sixth; // Sort these elements using a 5-element sorting network void *ae1 = A[e1], *ae2 = A[e2], *ae3 = A[e3], *ae4 = A[e4], *ae5 = A[e5]; void *t; // if (ae1 > ae2) { t = ae1; ae1 = ae2; ae2 = t; } if ( compareXY(ae1, ae2) > 0 ) { t = ae1; ae1 = ae2; ae2 = t; } if ( compareXY(ae4, ae5) > 0 ) { t = ae4; ae4 = ae5; ae5 = t; } if ( compareXY(ae1, ae3) > 0 ) { t = ae1; ae1 = ae3; ae3 = t; } if ( compareXY(ae2, ae3) > 0 ) { t = ae2; ae2 = ae3; ae3 = t; } if ( compareXY(ae1, ae4) > 0 ) { t = ae1; ae1 = ae4; ae4 = t; } if ( compareXY(ae3, ae4) > 0 ) { t = ae3; ae3 = ae4; ae4 = t; } if ( compareXY(ae2, ae5) > 0 ) { t = ae2; ae2 = ae5; ae5 = t; } if ( compareXY(ae2, ae3) > 0 ) { t = ae2; ae2 = ae3; ae3 = t; } if ( compareXY(ae4, ae5) > 0 ) { t = ae4; ae4 = ae5; ae5 = t; } A[e1] = ae1; A[e2] = ae2; A[e3] = ae3; A[e4] = ae4; A[e5] = ae5; // Fix end points if ( compareXY(ae1, A[N]) < 0 ) iswap(N, e1, A); if ( compareXY(A[M], ae5) < 0 ) iswap(M, e5, A); int duplicate = -1; // if ( ae1, ae5 ) { duplicate = e1; } else if ( compareXY(ae1, ae5) == 0 ) { duplicate = e1; } else if ( compareXY(ae1, ae4) == 0 ) { duplicate = e1; } else if ( compareXY(ae2, ae5) == 0 ) { duplicate = e2; } else if ( compareXY(ae1, ae3) == 0 ) { duplicate = e1; } else if ( compareXY(ae2, ae4) == 0 ) { duplicate = e2; } else if ( compareXY(ae3, ae5) == 0 ) { duplicate = e3; } else if ( compareXY(ae1, ae2) == 0 ) { duplicate = e1; } else if ( compareXY(ae2, ae3) == 0 ) { duplicate = e2; } else if ( compareXY(ae3, ae4) == 0 ) { duplicate = e3; } else if ( compareXY(ae4, ae5) == 0 ) { duplicate = e4; }; if ( 0 <= duplicate ) { void cut2S(); cut3duplicates(N, M, duplicate, cut2S, 0); return; } register void *T = ae3; // pivot // initialize running indices I= N; J= M; // The left segment has elements < T // The right segment has elements >= T // /* Left: I = I + 1; AI = A[I]; // if (AI < T) goto Left; if ( compareXY(AI, T) < 0 ) goto Left; Right: J = J - 1; AJ = A[J]; // if ( T <= AJ ) goto Right; if ( compareXY(T, AJ) <= 0 ) goto Right; if ( I < J ) { A[I] = AJ; A[J] = AI; goto Left; } int left = I-N; int right = M-J; if ( left < right ) { // smallest one first cut2S(N, J); // cut2S(I, M); N = I; goto Loop; } cut2S(I, M); // cut2S(N, J); M = J; goto Loop; } // (* OF cut2S; *) ... the brackets remind that this was Pascal code