Имеется массив char с 14k русских слов. Необходимо отсортировать этот массив по алфавиту. Готовые решения (например, qsort()) использовать нельзя. Решил сам реализовать алгоритм быстрой сортировки. И возникла проблема в том, что массив сортируется не до конца. Т.е. в результате, например, сначала идут слова на букву 'а', потом на букву 'б', а затем снова на 'а'. И не могу понять, в чем ошибка / недоработка
Вот основной код:
const int N = 14000; // Количество слов
const int M = 30; // Максимальное количество букв в слове
char words[N][M]; // Массив слов
int compare(const char *arg1, const char *arg2)
{
int i = _strcmpi(arg1, arg2);
// Решение проблем с букой ё при сортировке
if ((i >= 40 && i <= 45) || (i <= -40 && i >= -45))
i *= -1;
return i;
}
void sort(int begin, int end)
{
char* m = words[(begin + end) / 2];
int l = begin;
int r = end;
char temp[M];
while (l <= r)
{
while (compare(words[l], m) < 0) l++;
while (compare(words[r], m) > 0) r--;
if (l <= r)
{
strcpy_s(temp, words[l]);
strcpy_s(words[l], words[r]);
strcpy_s(words[r], temp);
l++;
r--;
}
}
if (l < end)
sort(l, end);
if (begin < r)
sort(begin, r);
}
int main()
{
/*
Считывание слов из файла
...
*/
sort(0, N-1)
}
Я понял, в чём была проблема. Для получения серединного (опорного) элемента, мы использовали указатель на этот самый элемент. Но во время работы алгоритма значение опорного элемента может меняться.
Решением проблемы стала замена этого участка кода
char* m = words[(begin + end) / 2];
На этот
char m[M];
strcpy_s(m, mas[(begin + end) / 2]);
Спасибо всем, кто думал над моим вопросом.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Доброго времени суток! Нужно было написать почтовый клиент на сокетах, использующего протокол POP3 для чтения сообщенийНемного погуглив, наклакал...
Подскажите, почему для вложенного тега li не работает свойство line-height?