2014 dxdy logo

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

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




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

 
 
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:11 
Ну просто напишите отдельно процедуру, сравнивающую две строки целиком и возвращающую булевское значение. А потом запустите эту процедуру хоть и пузырьком.

 
 
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:44 
Каким образом целиком?
Преположим, функция возвратит 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 
Второй оператор цикла -- совершенно дикий. А так логика примерно такая.

 
 
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 09:55 
Спасибо за совет!
ewert в сообщении #855635 писал(а):
Второй оператор цикла -- совершенно дикий.

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

 
 
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 11:12 
Я про это:

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

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

 
 
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение27.04.2014, 12:41 
да, тут я немножко ступил :oops:
когда дойду до части сортировки в своей программе - обязательно исправлю)

 
 
 
 Re: Си: наведение лексикографического порядка в массиве
Сообщение29.04.2014, 13:42 
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group