Сортировка строк в массиве по минимальному элементу
От: 2faust  
Дата: 14.12.05 08:31
Оценка:
Люди плз помогите.
Необходимо отсортировать строки в 2D массиве по минимальному элементу.
Столбцы в массиве менять нельзя.
с уважением, всегда ваш .... ;)
Re: Сортировка строк в массиве по минимальному элементу
От: valker  
Дата: 14.12.05 08:38
Оценка:
Здравствуйте, 2faust, Вы писали:

2>Люди плз помогите.

2>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>Столбцы в массиве менять нельзя.

Позвольте, а в чём, собственно, проблема?
Re: Сортировка строк в массиве по минимальному элементу
От: Аноним  
Дата: 14.12.05 08:43
Оценка:
Здравствуйте, 2faust, Вы писали:

2>Люди плз помогите.

2>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>Столбцы в массиве менять нельзя.


template <class T> T FindMin(T *t, int iCnt)
{
  T tMin = t[0];

  while (--iCnt > 0)
  {
    if (t[iCnt] < tMin)
        tMin = t[iCnt];
  }

  return tMin;
}

template <class T> void Sort(T **t, int iCntX, int iCntY)
{
  for (int iY2 = 0; iY2 < iCntY; ++iY2)
  {
    for (int iY = 1; iY < iCntY; ++iY)
    {
      if (FindMin(t[iY - 1], iCntX) > FindMin(t[iY], iCntX)
      {
        // Переставляем местами строки
      }
    }
  }
}


Наверное, где-то так... Если скорость не особо важна...
Re[2]: Сортировка строк в массиве по минимальному элементу
От: a_g_barnaul Россия  
Дата: 14.12.05 08:49
Оценка:
2>>Люди плз помогите.
2>>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>>Столбцы в массиве менять нельзя.

V>Позвольте, а в чём, собственно, проблема?


Да единственная проблема тут может быть в нехватке желания разбираться..

самый простой способ...делаешь еще один одномерный массив по количеству строк... пробегаешь и кидаешь туда самый минимальный элемент в строке... а потом сортируешь этот масивчик паралельно переставляя строки в исходном=)))) конечно это если то что ты написал, все условия задачи...

на будущее если лень разбираться в таких вопросах..то можно бросать это гиблое дело...=))))
ИМХО. в программирование должно быть хоть маленько усердия...=))
Re[2]: Сортировка строк в массиве по минимальному элементу
От: Аноним  
Дата: 14.12.05 08:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 2faust, Вы писали:


2>>Люди плз помогите.

2>>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>>Столбцы в массиве менять нельзя.


А>
А>template <class T> T FindMin(T *t, int iCnt)
А>{
А>  T tMin = t[0];

А>  while (--iCnt > 0)
А>  {
А>    if (t[iCnt] < tMin)
А>        tMin = t[iCnt];
А>  }

А>  return tMin;
А>}

А>template <class T> void Sort(T **t, int iCntX, int iCntY)
А>{
А>  for (int iY2 = 0; iY2 < iCntY; ++iY2)
А>  {
А>    for (int iY = 1; iY < iCntY; ++iY)
А>    {
А>      if (FindMin(t[iY - 1], iCntX) > FindMin(t[iY], iCntX)
А>      {
А>        // Переставляем местами строки
А>      }
А>    }
А>  }
А>}
А>


А>Наверное, где-то так... Если скорость не особо важна...

Да если важна то предыдущее=)))...
Единственное сомнение..что если человек не может отсортировать матрицу...сомневаюсь что ему нужно пременять шаблоны=))))))
Re: Сортировка строк в массиве по минимальному элементу
От: Bell Россия  
Дата: 14.12.05 09:14
Оценка:
Здравствуйте, 2faust, Вы писали:

2>Люди плз помогите.

2>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>Столбцы в массиве менять нельзя.


int main()
{
   vector<vector<int> > arr2d(3);
   arr2d[0].push_back(2);
   arr2d[0].push_back(3);
   arr2d[0].push_back(5);

   arr2d[1].push_back(5);
   arr2d[1].push_back(6);
   arr2d[1].push_back(7);

   arr2d[2].push_back(1);
   arr2d[2].push_back(2);
   arr2d[2].push_back(2);

   //Вектор пар: первое значение - минимальный элемент строки, второе значение - номер строки
   vector<pair<int, size_t> > rows(arr2d.size());

   for(size_t i = 0; i < arr2d.size(); ++i)
   {
      pair<int, size_t> p(*min_element(arr2d[i].begin(), arr2d[i].end()), i);
      rows[i] = p;
   }

   //стандартный оператор сравнения для pair<> вполне подходит
   sort(rows.begin(), rows.end());

   //трансформируем исходный массив в сортированный без копирования элементов
   vector<vector<int> > arr2d_sorted(3);
   for(size_t j = 0; j < rows.size(); ++j)
      arr2d_sorted[j].swap(arr2d[rows[j].second]);
   
   //Возвращаем все в исходный массив, опять же без копирования
   arr2d.swap(arr2d_sorted);
   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[2]: Сортировка строк в массиве по минимальному элементу
От: Аноним  
Дата: 14.12.05 09:18
Оценка:
Здравствуйте, Bell, Вы писали:

2>>Люди плз помогите.

2>>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>>Столбцы в массиве менять нельзя.


B>
B>int main()
B>{
<...skip...>
B>}
B>


IMHO, какой-то оверхед для простенькой задачи.
Re[3]: Сортировка строк в массиве по минимальному элементу
От: Bell Россия  
Дата: 14.12.05 09:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>IMHO, какой-то оверхед для простенькой задачи.

В чем именно ты видишь оверхед?
Любите книгу — источник знаний (с) М.Горький
Re[3]: Сортировка строк в массиве по минимальному элементу
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 14.12.05 09:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>IMHO, какой-то оверхед для простенькой задачи.


Сергей, выходи из сумрака !
"Что не завершено, не сделано вовсе" Гаусс
Re[4]: Сортировка строк в массиве по минимальному элементу
От: Аноним  
Дата: 14.12.05 10:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>IMHO, какой-то оверхед для простенькой задачи.

B>В чем именно ты видишь оверхед?

По использованию памяти, например. Да и количество циклов, наверное, можно уменьшить.
Мне кажется, что подобных задач использование STL несколько избыточно.

P.S. Может мне просто не нравится STL.
Re[5]: Сортировка строк в массиве по минимальному элементу
От: Bell Россия  
Дата: 14.12.05 10:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>По использованию памяти, например.

Давай посчитаем

N - количество строк
sizeof(pair<int, size_t>)*N + N*sizeof(vector<>)


На VC7.1 имеем: 8*N + 12*N == 20*N. ИМХО не так уж много
Зато сами элементы матрици вообще не копируются

А>Да и количество циклов, наверное, можно уменьшить.

А>Мне кажется, что подобных задач использование STL несколько избыточно.

А>P.S. Может мне просто не нравится STL.


Чтобы говорить конкретно — приведи свою реализацю этой простейшей задачи.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Сортировка строк в массиве по минимальному элементу
От: Аноним  
Дата: 14.12.05 10:40
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>По использованию памяти, например.

B>Давай посчитаем

B>
B>N - количество строк
B>sizeof(pair<int, size_t>)*N + N*sizeof(vector<>)
B>


B>На VC7.1 имеем: 8*N + 12*N == 20*N. ИМХО не так уж много

Ну, если учесть, что это не является необходимым...

B>Зато сами элементы матрици вообще не копируются

A метод swap?

А>>Да и количество циклов, наверное, можно уменьшить.

А>>Мне кажется, что подобных задач использование STL несколько избыточно.

А>>P.S. Может мне просто не нравится STL.


B>Чтобы говорить конкретно — приведи свою реализацю этой простейшей задачи.

Я бы развивал вот эту идею: http://gzip.rsdn.ru/Forum/Message.aspx?mid=1537705&amp;only=1
Автор:
Дата: 14.12.05


P.S. Мне вот интересно по скорости сравнить...
Re[7]: Сортировка строк в массиве по минимальному элементу
От: Bell Россия  
Дата: 14.12.05 10:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я бы развивал вот эту идею: http://gzip.rsdn.ru/Forum/Message.aspx?mid=1537705&amp;only=1
Автор:
Дата: 14.12.05

Опять слова...

А>P.S. Мне вот интересно по скорости сравнить...

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

B>>Зато сами элементы матрици вообще не копируются

А>A метод swap?
Метод swap вектора имеет сложность О(1), и меняет местами только внутренние указатели (3 штуки в известных мне реализациях)
Любите книгу — источник знаний (с) М.Горький
Re[6]: Сортировка строк в массиве по минимальному элементу
От: a_g_barnaul Россия  
Дата: 14.12.05 10:51
Оценка:
Здравствуйте, Bell, Вы писали:



B>Чтобы говорить конкретно — приведи свою реализацю этой простейшей задачи.

может я также как Аноним не люблю STL
int minEl(int *vectOfM)
{
  int  minEl =  vectOfM[0];
  for(int j=1;j<m;j++)
    if(minEl>vectOfM[j]) minEl = vectOfM[j];
  return minEl;
}

void SortMatr(int **Matrca,int n,int m) 
{
int *vect;
vect = new int[n];
for(int i = 0; i<n; i++)
   vect[i]=minEl(Matrca[i]);
for(int i = n-1; i>=0; i--)
 for(int j = 0; j<i; i++)
   if(vect[i]<vect[j])
      {
        перествили vect[i] vect[j]
        переставили Matrc[i] Matrc[j]
      }
delete vect;
}

а если так?
Re[8]: Сортировка строк в массиве по минимальному элементу
От: Аноним  
Дата: 14.12.05 11:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Я бы развивал вот эту идею: http://gzip.rsdn.ru/Forum/Message.aspx?mid=1537705&amp;only=1
Автор:
Дата: 14.12.05

B>Опять слова...
Почему слова? Не хватает только main'а и нескольких строчек в if'е. Или я что-то не учитываю?

А>>P.S. Мне вот интересно по скорости сравнить...

B>Я бы постеснялся говорить об эффективности этого варианта, да и его автор тоже добавил соответствующую оговорку, но, тем не менее, интересно было бы взглянуть на результат развития идеи.
Но мне кажется, что скорость реализации на STL будет выше, только для достаточно больших объёмов данных. Из-за кеширования результа поиска минимума в строке...

B>>>Зато сами элементы матрици вообще не копируются

А>>A метод swap?
B>Метод swap вектора имеет сложность О(1), и меняет местами только внутренние указатели (3 штуки в известных мне реализациях)
Я имел ввиду, что там тоже есть копирование.
Re[7]: Сортировка строк в массиве по минимальному элементу
От: a_g_barnaul Россия  
Дата: 14.12.05 11:15
Оценка:
Кстати перестановку строк тоже указателями зделать.. и вродь просто.. и без особых замарочек..
Re[7]: Сортировка строк в массиве по минимальному элементу
От: Bell Россия  
Дата: 14.12.05 11:16
Оценка:
Здравствуйте, a_g_barnaul, Вы писали:

__>может я также как Аноним не люблю STL

Видимо, из-за любви к изобретению велосипедов
__>
__>int minEl(int *vectOfM)
__>{
__>  int  minEl =  vectOfM[0];
__>  for(int j=1;j<m;j++)
__>    if(minEl>vectOfM[j]) minEl = vectOfM[j];
__>  return minEl;
__>}

__>void SortMatr(int **Matrca,int n,int m) 
__>{
__>int *vect;
__>vect = new int[n];
__>for(int i = 0; i<n; i++)
__>   vect[i]=minEl(Matrca[i]);
__>for(int i = n-1; i>=0; i--)
__> for(int j = 0; j<i; i++)
__>   if(vect[i]<vect[j])
__>      {
__>        перествили vect[i] vect[j]
__>        переставили Matrc[i] Matrc[j]
__>      }
__>delete vect;
__>}
__>

__>а если так?

minEl повторяет (причем не лучшим образом — элементы vectOfM, равные minEl, будут его перезаписывать) std::min_element. Кстати в сигнуре не хватает параметра m.

Как мне кажется, пузырьковая сортировка, которая имеет здесь место быть, никогда не считалась оптимальным вариантом — ее сложность O(N**2), в то время как std::sort имеет сложность N*log(N).

delete vect;

Неопределенной поведение. Нужно delete [] vect;
Любите книгу — источник знаний (с) М.Горький
Re[8]: Сортировка строк в массиве по минимальному элементу
От: Bell Россия  
Дата: 14.12.05 11:21
Оценка:
Здравствуйте, a_g_barnaul, Вы писали:

__>Кстати перестановку строк тоже указателями зделать.. и вродь просто.. и без особых замарочек..

Ну если еще и строки матрицы в процессе сортировки поэлементно копировать...
Любите книгу — источник знаний (с) М.Горький
Re[8]: Сортировка строк в массиве по минимальному элементу
От: a_g_barnaul Россия  
Дата: 14.12.05 11:36
Оценка:
Здравствуйте, Bell, Вы писали:
B>minEl повторяет (причем не лучшим образом — элементы vectOfM, равные minEl, будут его перезаписывать) std::min_element. Кстати в сигнуре не хватает параметра m.

поторопился=) Сори...
Re: Сортировка строк в массиве по минимальному элементу
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 14.12.05 12:36
Оценка:
Здравствуйте, 2faust, Вы писали:

2>Люди плз помогите.

2>Необходимо отсортировать строки в 2D массиве по минимальному элементу.
2>Столбцы в массиве менять нельзя.

Bell привел вариант с использованием stl и был обвинен в оверхеде я развил его идею и придумал вариант без оверхеда:
#include <vector>
#include <algorithm>
#include <functional>
#include <boost/bind.hpp>
using namespace std;

template <class T, class U> U unwrap(T t) { return *t; }

int main()
{
    vector<vector<int> > v(3);
    typedef vector<int>::iterator IteratorType;
    for_each(v.begin(), v.end(), boost::bind(&vector<int>::resize, _1, 3));
    v[0][0] = 6; v[0][1] = 4; v[0][2] = 8;
    v[1][0] = 7; v[1][1] = 9; v[1][2] = 3;
    v[2][0] = 2; v[2][1] = 1; v[2][2] = 5;

    // вся работа в одной строчке
    sort(v.begin(), v.end(), boost::bind<bool>(less<size_t>(), boost::bind<size_t>(&unwrap<IteratorType, size_t>, boost::bind<IteratorType>(&min_element<IteratorType>, boost::bind(&vector<int>::begin, _1), boost::bind(&vector<int>::end, _1))), boost::bind<size_t>(&unwrap<IteratorType, size_t>, boost::bind<IteratorType>(&min_element<IteratorType>, boost::bind(&vector<int>::begin, _2), boost::bind(&vector<int>::end, _2)))));
    
    return 0;
}
"Что не завершено, не сделано вовсе" Гаусс
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.