Advertisement
Guest User

csort

a guest
Feb 20th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.34 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. int split(char* s, char*** words)
  6. {
  7.         int n = 0;
  8.         char** wordss = malloc(sizeof(char*));
  9.         char* part = strtok(s, " ");
  10.        
  11.         while (part != 0) {
  12.                 wordss[n] = (char*)malloc((strlen(part) + 1) * sizeof(char));
  13.                 strcpy(wordss[n], part);
  14.                 part = strtok(0, " ");
  15.                 n++;
  16.                 wordss = (char**)realloc(wordss, (n + 1) * sizeof(char*));
  17.         }
  18.         *words = (char**)wordss;
  19.         return n;
  20. }
  21.  
  22. #define INITIAL_SIZE 128
  23.  
  24. char *getstring()
  25. {
  26.     char *s;
  27.     int flag, len = 0, size = INITIAL_SIZE;
  28.  
  29.     s = (char*)malloc(INITIAL_SIZE);
  30.     if (s == NULL) return NULL;
  31.  
  32.     for (;;) {
  33.         if (fgets(s+len, size-len, stdin) == NULL) {
  34.             free(s);
  35.             return NULL;
  36.         }
  37.  
  38.         len += (int)strlen(s+len);
  39.         if (s[len-1] == '\n') break;
  40.  
  41.         char *new_s = (char*)malloc(size *= 2);
  42.         if (new_s == NULL) {
  43.             free(s);
  44.             return NULL;
  45.         }
  46.  
  47.         memcpy(new_s, s, len);
  48.         free(s);
  49.         s = new_s;
  50.     }
  51.  
  52.     s[len - 1] = 0;
  53.     return s;
  54. }
  55.  
  56. void csort(char *src, char *dest, int w) {
  57.   char **words;
  58.   char n = split(src, &words);
  59.   int a[n], count[n], b[n], c[n];
  60.   for (int i = 0; i < n; i++) {
  61.     a[i] = strlen(words[i]);
  62.     count[i] = 0;
  63.   }
  64.   int j = 0;
  65.   while (j < n - 1) {
  66.     int i = j + 1;
  67.     while (i < n) {
  68.       if (a[i] < a[j]) {
  69.         count[j]++;
  70.       }
  71.       else {
  72.         count[i]++;
  73.       }
  74.       i++;
  75.     }
  76.     j++;
  77.   }
  78.  
  79.   for (int i = 0; i < n; i++) {
  80.     c[i] = count[i];
  81.   }
  82.   for (int i = 0; i < n; ++i) {
  83.         b[c[i]] = i;
  84.   }
  85.   for (int i = 0; i < n; i++) {
  86.     printf("%s ", words[b[i]]);
  87.   }
  88.  
  89.   for (int i = 0; i < n; i++) free(words[i]);
  90.   free(words);
  91. }
  92.  
  93. int main()
  94. {
  95.     char* s = getstring();
  96.     char d[1000];
  97.     int w = strlen(s);
  98.     csort(s, d, w);
  99.     //printf("%s", d);
  100.     free(s);
  101.     return 0;
  102. }
  103.  
  104. ____________________________________________________________________________________________________________________________
  105.  
  106. Сортировка подсчётом сравнений
  107.  
  108. Составьте функцию сsort, выполняющую сортировку слов в предложении методом подсчёта сравнений. Слова в предложении разделяются произвольным количеством пробелов. Функция csort должна быть объявлена следующим образом:
  109. void csort(char *src, char *dest)
  110. {
  111.         ...
  112. }
  113. В качестве параметров функция csort принимает указатель на исходное предложение src и указатель на пустой буфер dest подходящего размера. В результате работы функции в буфер dest записывается новое предложение, состоящее из слов, взятых из исходного предложения и отсортированных в порядке возрастания их длин. При этом слова в новом предложении разделяются одним пробелом.
  114. Рассмотрим пример работы функции csort. Пусть исходное предложение выглядит как
  115.  
  116. qqq  www  t  aa rrr  bb  x y zz
  117.  
  118. Тогда в выходной буфер должно быть записано предложение
  119.  
  120. t x y aa bb zz qqq www rrr
  121.  
  122. Замечание.
  123. Алгоритм сортировки подсчётом сравнений, реализуемый функцией csort, нужно модифицировть таким образом, чтобы массив count содержал индексы первых букв слов в отсортированном предложении.
  124. Итоговую программу, содержащую как функцию csort, так и функцию main, демонстрирующую работоспособность функции csort, нужно назвать csort.c. Программа должна считывать исходное предложение с клавиатуры.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement