Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- int split(char* s, char*** words)
- {
- int n = 0;
- char** wordss = malloc(sizeof(char*));
- char* part = strtok(s, " ");
- while (part != 0) {
- wordss[n] = (char*)malloc((strlen(part) + 1) * sizeof(char));
- strcpy(wordss[n], part);
- part = strtok(0, " ");
- n++;
- wordss = (char**)realloc(wordss, (n + 1) * sizeof(char*));
- }
- *words = (char**)wordss;
- return n;
- }
- #define INITIAL_SIZE 128
- char *getstring()
- {
- char *s;
- int flag, len = 0, size = INITIAL_SIZE;
- s = (char*)malloc(INITIAL_SIZE);
- if (s == NULL) return NULL;
- for (;;) {
- if (fgets(s+len, size-len, stdin) == NULL) {
- free(s);
- return NULL;
- }
- len += (int)strlen(s+len);
- if (s[len-1] == '\n') break;
- char *new_s = (char*)malloc(size *= 2);
- if (new_s == NULL) {
- free(s);
- return NULL;
- }
- memcpy(new_s, s, len);
- free(s);
- s = new_s;
- }
- s[len - 1] = 0;
- return s;
- }
- void csort(char *src, char *dest, int w) {
- char **words;
- char n = split(src, &words);
- int a[n], count[n], b[n], c[n];
- for (int i = 0; i < n; i++) {
- a[i] = strlen(words[i]);
- count[i] = 0;
- }
- int j = 0;
- while (j < n - 1) {
- int i = j + 1;
- while (i < n) {
- if (a[i] < a[j]) {
- count[j]++;
- }
- else {
- count[i]++;
- }
- i++;
- }
- j++;
- }
- for (int i = 0; i < n; i++) {
- c[i] = count[i];
- }
- for (int i = 0; i < n; ++i) {
- b[c[i]] = i;
- }
- for (int i = 0; i < n; i++) {
- printf("%s ", words[b[i]]);
- }
- for (int i = 0; i < n; i++) free(words[i]);
- free(words);
- }
- int main()
- {
- char* s = getstring();
- char d[1000];
- int w = strlen(s);
- csort(s, d, w);
- //printf("%s", d);
- free(s);
- return 0;
- }
- ____________________________________________________________________________________________________________________________
- Сортировка подсчётом сравнений
- Составьте функцию сsort, выполняющую сортировку слов в предложении методом подсчёта сравнений. Слова в предложении разделяются произвольным количеством пробелов. Функция csort должна быть объявлена следующим образом:
- void csort(char *src, char *dest)
- {
- ...
- }
- В качестве параметров функция csort принимает указатель на исходное предложение src и указатель на пустой буфер dest подходящего размера. В результате работы функции в буфер dest записывается новое предложение, состоящее из слов, взятых из исходного предложения и отсортированных в порядке возрастания их длин. При этом слова в новом предложении разделяются одним пробелом.
- Рассмотрим пример работы функции csort. Пусть исходное предложение выглядит как
- qqq www t aa rrr bb x y zz
- Тогда в выходной буфер должно быть записано предложение
- t x y aa bb zz qqq www rrr
- Замечание.
- Алгоритм сортировки подсчётом сравнений, реализуемый функцией csort, нужно модифицировть таким образом, чтобы массив count содержал индексы первых букв слов в отсортированном предложении.
- Итоговую программу, содержащую как функцию csort, так и функцию main, демонстрирующую работоспособность функции csort, нужно назвать csort.c. Программа должна считывать исходное предложение с клавиатуры.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement