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: Сортировка строк в массиве по минимальному элементу
Здравствуйте, 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]: Сортировка строк в массиве по минимальному элементу
Здравствуйте, Аноним, Вы писали:
А>IMHO, какой-то оверхед для простенькой задачи.
Сергей, выходи из сумрака !
"Что не завершено, не сделано вовсе" Гаусс
Re[4]: Сортировка строк в массиве по минимальному элементу
От:
Аноним
Дата:
14.12.05 10:00
Оценка:
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>IMHO, какой-то оверхед для простенькой задачи. B>В чем именно ты видишь оверхед?
По использованию памяти, например. Да и количество циклов, наверное, можно уменьшить.
Мне кажется, что подобных задач использование STL несколько избыточно.
P.S. Может мне просто не нравится STL.
Re[5]: Сортировка строк в массиве по минимальному элементу
Здравствуйте, Аноним, Вы писали:
А>По использованию памяти, например.
Давай посчитаем
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&only=1
Опять слова...
А>P.S. Мне вот интересно по скорости сравнить...
Я бы постеснялся говорить об эффективности этого варианта, да и его автор тоже добавил соответствующую оговорку, но, тем не менее, интересно было бы взглянуть на результат развития идеи.
B>>Зато сами элементы матрици вообще не копируются А>A метод swap?
Метод swap вектора имеет сложность О(1), и меняет местами только внутренние указатели (3 штуки в известных мне реализациях)
Любите книгу — источник знаний (с) М.Горький
Re[6]: Сортировка строк в массиве по минимальному элементу
B>Опять слова...
Почему слова? Не хватает только main'а и нескольких строчек в if'е. Или я что-то не учитываю?
А>>P.S. Мне вот интересно по скорости сравнить... B>Я бы постеснялся говорить об эффективности этого варианта, да и его автор тоже добавил соответствующую оговорку, но, тем не менее, интересно было бы взглянуть на результат развития идеи.
Но мне кажется, что скорость реализации на STL будет выше, только для достаточно больших объёмов данных. Из-за кеширования результа поиска минимума в строке...
B>>>Зато сами элементы матрици вообще не копируются А>>A метод swap? B>Метод swap вектора имеет сложность О(1), и меняет местами только внутренние указатели (3 штуки в известных мне реализациях)
Я имел ввиду, что там тоже есть копирование.
Re[7]: Сортировка строк в массиве по минимальному элементу
minEl повторяет (причем не лучшим образом — элементы vectOfM, равные minEl, будут его перезаписывать) std::min_element. Кстати в сигнуре не хватает параметра m.
Как мне кажется, пузырьковая сортировка, которая имеет здесь место быть, никогда не считалась оптимальным вариантом — ее сложность O(N**2), в то время как std::sort имеет сложность N*log(N).
delete vect;
Неопределенной поведение. Нужно delete [] vect;
Любите книгу — источник знаний (с) М.Горький
Re[8]: Сортировка строк в массиве по минимальному элементу
Здравствуйте, a_g_barnaul, Вы писали:
__>Кстати перестановку строк тоже указателями зделать.. и вродь просто.. и без особых замарочек..
Ну если еще и строки матрицы в процессе сортировки поэлементно копировать...
Любите книгу — источник знаний (с) М.Горький
Re[8]: Сортировка строк в массиве по минимальному элементу
Здравствуйте, Bell, Вы писали: B>minEl повторяет (причем не лучшим образом — элементы vectOfM, равные minEl, будут его перезаписывать) std::min_element. Кстати в сигнуре не хватает параметра m.
поторопился=) Сори...
Re: Сортировка строк в массиве по минимальному элементу