Почему не правильно сортирует массивы(Bubble sort)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubbleSort(int* arr, char* arr2, char **arr3, int sizeArr) {
int *temp;
char *temp1;
char *temp2;
for (int i = 0; i < sizeArr; ++i) {
if ((arr[i] > arr[i + 1]) &&(arr2[i]>arr2[i+1] && (arr3[i]>arr3[i+1]))) {
temp = &arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = *temp;
temp1 = &arr2[i];
arr2[i] = arr2[i + 1];
arr2[i + 1] = *temp1;
temp2 = arr3[i];
arr3[i] = arr3[i + 1];
arr3[i + 1] = temp2;
}
}
}
void func(int num, char **word, int *wc, char *is) {
for (int i = 0; i < num; i++) {
wc[i]++;
for (int j = 0; j < num; j++) {
if (i != j && strcmp(word[i], word[j]) == 0) {
if (wc[i]++ == 1 && i < j)
is[i] = 1;
}
}
}
}
int main(void)
{
char** words = NULL; // указатель на слова
int num_words = 0; // кол во слов
char* delim = " \t\n,.!?:";
int size_file = 0; //размер файла
FILE* fp = fopen("test.txt", "r");
fseek(fp, 0, SEEK_END);
size_file = ftell(fp); //находим размер файла
printf("%d\n", size_file);
char* buffer = calloc(size_file + 1, sizeof(char)); //буфер
if (buffer == NULL) {
printf("Ошибка выделения памяти\n");
exit(-1);
}
fseek(fp, 0, SEEK_SET);
fread(buffer, 1, size_file, fp);
printf("\nТекст файла\n\n");
printf("%s\n", buffer);
char* istr = strtok(buffer, delim);
while (istr) {
words = realloc(words, (num_words + 1) * sizeof(char*));
words[num_words++] = istr;
istr = strtok(NULL, delim);
//printf("%s\n", istr);
}
/*for (int i=0; i<num_words;i++) {
printf("%p\n", words[i]);
}*/
printf("Количество символов в файле :%d\n", size_file);
printf("Количество слов в файле :%d\n\n", num_words);
for (int i = 0; i < num_words; i++) {
puts(words[i]);
}
printf("\nНахождение одинаковых слов, не сортирован\n");
int* wcnt = calloc(num_words, sizeof(int));
char* is_first = calloc(num_words, sizeof(char));
func(num_words, words, wcnt, is_first);
for (int i = 0; i < num_words; i++) {
if (wcnt[i] == 1 || is_first[i])
if (wcnt[i] > 1 ) {
printf("%s = %d\n", words[i], wcnt[i]);
}
}
printf("--------------\n");
bubbleSort(wcnt, is_first, words, num_words);
for (int i=num_words; i>0; i--)
{
if((wcnt[i]>1) && (is_first[i]>0))
printf("%d %d %s\n", is_first[i], wcnt[i], words[i]);
}
fclose(fp);
free(buffer);
free(words);
free(wcnt);
free(is_first);
return 0;
}
Вот код. Программа проходится по файлу, находит одинаковые слова и считает их частоту встречи. Если она больше 1, то выводит, но сначала выводит в не отсортированном виде. Попытался отсортировать с помощью пузырьковой сортировки, но она просто не сортирует, как был порядок слов таким и остался
Ответы (1 шт):
Автор решения: DSuhoi
→ Ссылка
Вариант сортировки массива строк с помощью функции qsort():
//функция для сортировки строк по возрастанию
int comp (const void * a, const void * b)
{
return strcmp(*(char**)a,*(char**)b);
}
Функция comp отвечает за способ сортировки (по убыванию,по возрастанию и т.п.).
printf("--------------\n");
//bubbleSort(wcnt, is_first, words, num_words);
qsort (words, num_words, sizeof(char**), comp); //сортировка массива строк
//простой вывод слов
for(int i=0, repWord = 1; i< num_words; i++){
//если слова одинаковые (и это не конец массива), то инкрементируем счётчик
if((i!=num_words-1) && !strcmp(words[i], words[i+1])) ++repWord;
else{ //иначе выводим слово и кол-во его повторов
printf("%d. %s - %d\n",(i+1),words[i], repWord);
repWord = 1;}
}
/*
for (int i=num_words; i>0; i--)
{
if((wcnt[i]>1) && (is_first[i]>0))
printf("%d %d %s\n", is_first[i], wcnt[i], words[i]);
}
*/