Advertisement
Guest User

Untitled

a guest
Nov 27th, 2015
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. // wskazowka do sortowania pozycyjnego
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7.  
  8. #define MAX 60000l
  9. #define MLD 1000000000.0 //10**9
  10. #define max_dl 254
  11.  
  12.  
  13. char **A,**B,**C;
  14. int max;
  15.  
  16.  
  17. void czytaj_z_pliku(char **A, int ilosc){
  18. FILE *fp;
  19. fp = fopen("nazwiska.txt", "r");
  20. max = 0;
  21.  
  22. char slowo[max_dl];
  23. int liczba;
  24. int i=0, j=0;
  25. for (i=0;i<ilosc; i++){
  26. fscanf(fp, "%i %s", &liczba, slowo);
  27. A[i] = (char*) malloc(sizeof(char)*max_dl);
  28. if (max < strlen(slowo)) max = strlen(slowo);
  29. strcpy(A[i],slowo);
  30. for (j = strlen(slowo); j < max_dl-1; j++) A[i][j] = 0;
  31. }
  32. fclose(fp);
  33. }
  34.  
  35. double sortuj_zliczenie(char **A, int n){
  36. struct timespec tp0, tp1;
  37. double Tn,Fn,x;
  38.  
  39. clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&tp0);
  40.  
  41. int i, j, l, k = max_dl;
  42. int C[256];
  43.  
  44. for (l = max - 1; l >= 0; l--){
  45. for (i = 0; i <= k; i++)
  46. C[i] = 0;
  47.  
  48. for (j = 0; j < n; j++){
  49. C[*(A[j]+l)] += 1;
  50. }
  51.  
  52. for (i = 1; i <= k; i++)
  53. C[i] += C[i-1];
  54.  
  55. for (j = 0; j < n; j++)
  56. {
  57. B[C[*(A[j]+l)]-1] = A[j];
  58. C[*(A[j]+l)] -= 1;
  59. }
  60.  
  61. if (l == 0) {
  62. for (i = 0; i < n; i++)
  63. A[i] = B[i];
  64. }
  65. else {
  66. for (i = 0; i < n; i++)
  67. A[n-1-i] = B[i];
  68. }
  69. }
  70.  
  71. clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&tp1);
  72. Tn=(tp1.tv_sec+tp1.tv_nsec/MLD)-(tp0.tv_sec+tp0.tv_nsec/MLD);
  73. return Tn;
  74. }
  75.  
  76. int sortuj_quicksort_partition(char **C, int p, int r)
  77. {
  78. char* x = C[p];
  79. int i = p, j = r;
  80. char *t;
  81. while (1)
  82. {
  83. while (strcmp(C[j], x) > 0)
  84. j--;
  85. while (strcmp(C[i], x) < 0)
  86. i++;
  87. if (i < j)
  88. {
  89. t = C[i];
  90. C[i] = C[j];
  91. C[j] = t;
  92. i++;
  93. j--;
  94. }
  95. else return j;
  96. }
  97. }
  98.  
  99. void sortuj_quicksort(char **C, int p, int r){
  100. if (p < r)
  101. {
  102. int q = sortuj_quicksort_partition(C, p, r);
  103. sortuj_quicksort(C, p, q);
  104. sortuj_quicksort(C, q+1, r);
  105. }
  106. }
  107.  
  108. double sortuj_quick(char **C, int n)
  109. {
  110. struct timespec tp0, tp1;
  111. double Tn,Fn,x;
  112.  
  113. clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&tp0);
  114.  
  115. sortuj_quicksort(C, 0, n-1);
  116.  
  117. clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&tp1);
  118. Tn=(tp1.tv_sec+tp1.tv_nsec/MLD)-(tp0.tv_sec+tp0.tv_nsec/MLD);
  119. return Tn;
  120. }
  121.  
  122. main(){
  123. int n=20000; //maksymalna dlugosc
  124. int j;
  125. FILE *fp, *fp2;
  126. // przez zliczenie
  127. A=(char**) malloc(n*sizeof(char*));
  128. B=(char**) malloc(n*sizeof(char*));
  129.  
  130. // przez quicksort
  131. C=(char**) malloc(n*sizeof(char*));
  132.  
  133. czytaj_z_pliku(A,n);
  134. czytaj_z_pliku(C,n);
  135.  
  136. printf("Przez zliczenie: %lf s\n", sortuj_zliczenie(A,n));
  137. printf("Przez quicksort: %lf s\n", sortuj_quick(C,n));
  138.  
  139. fp = fopen("nazwiska_zliczanie.txt", "w+");
  140. for (j = 0; j < n; j++)
  141. fprintf(fp, "%s\n", A[j]);
  142.  
  143. fp2 = fopen("nazwiska_quicksort.txt", "w+");
  144. for (j = 0; j < n; j++)
  145. fprintf(fp, "%s\n", C[j]);
  146.  
  147. fclose(fp);
  148. fclose(fp2);
  149.  
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement