2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:04 


04/05/13
125
Есть структура по сути являющаяся двумерным массивом. Нужно отсортировать строки лексикографически. Все элементы это цифры от 0 до 2: 0, 1 или 2.
Я думал сделать так: сначала отсортировать строки по первому элементу. Потом, отсортировать строки у которых первый элемент одинаковый по второму элементу. И так далее пока не дойду до последнего элемента. Но никак не могу продумать алгоритм. Можно ли реализовать мой алгоритм через рекурсию? Я хотел сделать что-то похожее на сортировку слиянием, но пока не получается.

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:11 
Заслуженный участник


11/05/08
32166
Ну просто напишите отдельно процедуру, сравнивающую две строки целиком и возвращающую булевское значение. А потом запустите эту процедуру хоть и пузырьком.

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:44 


04/05/13
125
Каким образом целиком?
Преположим, функция возвратит 1, если строки нужно поменять местами и 0, если менять местами их не нужно. Функция сравнивает строки поэлементно, то есть первый элемент с первым, второй с вторым и так далее. Если функция обнаружит, что элемент первой строки (будем считать, что первая строка стоит выше второй) оказался меньше элемента второй строки, то она возвратит 1. Если дойдет до конца так и не обнаружив, то возвратит 0. Обозначим эту функцию Func1.
Сортирующая функция выглядит примерно так:
Код:
int Sort(struct *d, int n, int m) //n-количество строк, m-количество столбцов
{
  int i, j;
  for(i=0; i<n; i++)
    for(j=0; j<m; j++)
     if(Func1(d, i, j)) Func2(d, i, j);  //Func2 меняет местами i-ую и j-ую строку местами
  return 0;
}

Я правильно рассуждаю?

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:50 
Заслуженный участник


11/05/08
32166
Второй оператор цикла -- совершенно дикий. А так логика примерно такая.

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:55 


04/05/13
125
Спасибо за совет!
ewert в сообщении #855635 писал(а):
Второй оператор цикла -- совершенно дикий.

Вы про if(Func1(d, i, j)) ?

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 11:12 
Заслуженный участник


11/05/08
32166
Я про это:

inky в сообщении #855634 писал(а):
for(j=0; j<m; j++)

Ни нижний, ни тем более верхний пределы не годятся.

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 12:41 


04/05/13
125
да, тут я немножко ступил :oops:
когда дойду до части сортировки в своей программе - обязательно исправлю)

 Профиль  
                  
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение29.04.2014, 13:42 


04/05/13
125
ewert, не могли бы вы указать где ошибка в моем коде?
Код:
int task_02_4_02_sortcheck(DNF *d, int l, int ll, int n)
{
int i;
for(i=0;i<n;i++)
  if(d[l].a[i]>d[ll].a[i]) return 1;
return 0;
}
//======================================================================d--это структура, двумерный массив
//======================================================================m--количество строк, n--количество столбцов
int task_02_4_02_sort(DNF *d, int m, int n)
{
int i, j, t, ij;
for(i=0;i<m;i++)
  for(j=i+1;j<m;j++)
   if(task_02_4_02_sortcheck(d, i, j, n)==1)
   {
    for(ij=0;ij<n;ij++)
    {
     t=d[i].a[ij];
     d[i].a[ij]=d[j].a[ij];
     d[j].a[ij]=t;
    }
   }
   return 0;
}

функция должна сортировать строки массива в лексикографическом порядке

-- 29.04.2014, 15:48 --

эм...кажется я уже сам понял. Попробую исправить алгоритм и протестирую еще раз

-- 29.04.2014, 15:54 --

Сделал так:
Код:
int task_02_4_02_sortcheck(DNF *d, int l, int ll, int n)
{
int i;
for(i=0;i<n;i++)
{
  if(d[l].a[i]<d[ll].a[i]) break;
  if(d[l].a[i]>d[ll].a[i]) return 1;
}
return 0;
}

и все заработало правильно :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group