コード例 #1
0
ファイル: quickSort.cpp プロジェクト: jamesguoxin/Algorithms
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;
}
コード例 #2
0
ファイル: ejercicio4.c プロジェクト: bertuccio/AALG
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;
}
コード例 #3
0
ファイル: quicksort.c プロジェクト: mcxiaoke/dsaac
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");
	}
}
コード例 #4
0
ファイル: quickSort.cpp プロジェクト: jamesguoxin/Algorithms
unsigned long long int countComp(int* IntegerArray, int start, int end) {
  int position;
  position = quicksort1(IntegerArray, start, end);
  return nbComp;
}
コード例 #5
0
ファイル: UseParFourSort.c プロジェクト: andrewhsu/foursort
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