Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.76 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5.  
  6. #define LEN 256
  7.  
  8. void free_array(char**, int);
  9. void print_array(char**, int);
  10. void quicksort(char**, int);
  11. void swap(char**, char**);
  12.  
  13. void swap(char** a, char** b) {
  14.     char* tmp = *a;
  15.     *a = *b;
  16.     *b = tmp;
  17. }
  18.  
  19. void free_array(char** a, int n) {
  20.     int i;
  21.     for (i = 0; i < n; ++i)
  22.         free(a[i]);
  23.     free(a);
  24.     return;
  25. }
  26.  
  27. void print_array(char** a, int n) {
  28.     FILE* fp;
  29.     int i;
  30.     fp = fopen("out.txt", "w");
  31.     for (i = 0; i < n; ++i)
  32.         fprintf(fp, "%s\n", a[i]);
  33.     fclose(fp);
  34. }
  35.  
  36. void quicksort(char** a, int n) {
  37.     int k, i, j; char **t, *x;
  38.     if (n < 1) return;
  39.     while (n > 1) {
  40.         x = a[0], i = -1, j = n;
  41.         while (1) {
  42.             do --j;
  43.             while (strcmp(a[j], x) > 0);
  44.             do ++i;
  45.             while (strcmp(a[i], x) < 0);
  46.             if (i < j)
  47.                 swap(a + i, a + j);
  48.             else
  49.                 break;
  50.         }
  51.         if (j + 1 < n - j - 1) {
  52.             ++j;
  53.             n -= j;
  54.             t = a;
  55.             a += j;
  56.         }
  57.         else  {
  58.             t = a + j + 1;
  59.             j = n - j - 1;
  60.             n -= j;
  61.         }
  62.         quicksort(t, j);
  63.     }
  64. }
  65.  
  66. int main(void) {
  67.     int i, j, k, n = 0;
  68.     char **a = NULL;
  69.     char t[LEN];
  70.     FILE* fp;
  71.  
  72.     fp = fopen("in.txt", "r");
  73.     if (!fp) {
  74.         return 1;
  75.     }
  76.  
  77.     while (fscanf(fp, "%s", t) == 1) {
  78.         if (!(a = (char**)realloc(a, (n + 1) * sizeof(char*)))) {
  79.             free_array(a, n);
  80.             fclose(fp);
  81.             return 1;
  82.         }
  83.         for (j = 0; t[j]; ++j);
  84.         if (!(a[n] = (char*)malloc(j + 1))) {
  85.             free_array(a, n);
  86.             fclose(fp);
  87.             return 1;
  88.         }
  89.         for (k = 0; k <= j; ++k)
  90.             a[n][k] = t[k];
  91.         ++n;
  92.     }
  93.  
  94.     quicksort(a, n);
  95.     print_array(a, n);
  96.     free_array(a, n);
  97.  
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement