Суббота, 28 Января 2023, 15:27

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Сравнение строк динамического массива
Сравнение строк динамического массива
JSentДата: Четверг, 09 Октября 2014, 19:26 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Нужно реализовать сортировку строк динамического массива методом Шелла.
Передаётся сам массив и количество строк void sort(char **mas, int N)
Для одномерного массива нашёл это:
Код
void sort_shell(int *a,int N)
{
   for(int d=N/2; d > 0; d/=2)
          for(int i=d; i < N; i++)
            for(int j = i; j>=d && a[j - d] > a[j]; j -= d)
                     swap(a[j], a[j-d]);
   }


Работает.
Теперь надо разобраться со строками. Как лучше сделать? Функция _stricmp() отказывается работать.


Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.

Сообщение отредактировал JSent - Четверг, 09 Октября 2014, 19:26
RUNGOGET2THECHOPAHДата: Четверг, 09 Октября 2014, 20:24 | Сообщение # 2
участник
Сейчас нет на сайте
Код
for(int j = i; j>=d && _stricmp(a[j - d], a[j]) > 0; j -= d)
JSentДата: Четверг, 09 Октября 2014, 21:18 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
С этим разобрался, спасибо.

Сделал, всё работает. Не подскажите теперь, как объединить обе функции (различаются только знаком больше-меньше). Чтобы можно было передать в функцию направление сортировки?

Код
void sortAscending(char **mas, int N, int length)
{
char *tmp = new char[length];
for(int d=N/2; d > 0; d/=2)
for(int i=d; i < N; i++)
for(int j = i; j>=d && _stricmp(mas[j - d], mas[j])>]0; j -= d)
{
strcpy(tmp, mas[j]);
strcpy(mas[j], mas[j-d]);
strcpy(mas[j-d], tmp);
}
  delete [] tmp;
}

Код
void sortDescending(char **mas, int N, int length)
{
char *tmp = new char[length];
for(int d=N/2; d > 0; d/=2)
for(int i=d; i < N; i++)
for(int j = i; j>=d && _stricmp(mas[j - d], mas[j])<0; j -= d)
{
strcpy(tmp, mas[j]);
strcpy(mas[j], mas[j-d]);
strcpy(mas[j-d], tmp);
}
  delete [] tmp;
}


Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.

Сообщение отредактировал JSent - Четверг, 09 Октября 2014, 21:22
RUNGOGET2THECHOPAHДата: Четверг, 09 Октября 2014, 21:31 | Сообщение # 4
участник
Сейчас нет на сайте
JSent, можно третьим параметром в функцию передавать int, принимающий значения +-1, и умножать на него результат функции _stricmp. Тогда в случае +1 будет сортировка по возрастанию, а при -1 - по убыванию.

А если по-нормальному делать, то через шаблоны:
Код

template<typename T, typename Compare>
void sort_shell(T *a, int N, Compare compare)
{  
    for( int d = N/2; d > 0; d /= 2 )
     for( int i = d; i < N; i++ )
      for( int j = i; j >= d && compare( a[j - d], a[j] ); j -= d)
       swap( a[j], a[j-d] );  
}

Здесь compare - это указатель на функцию сравнения двух элементов массива.
Вызывать потом это можно например так:
Код

sort_shell( arr, N, [](char* a, char* b){ return _stricmp(a, b) > 0; } );   //для обратного порядка меняем функцию сравнения
Форум игроделов » Программирование » C/C++ » Сравнение строк динамического массива
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2023 Рейтинг