Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

schnelle Sortierung

353  1 2 все
  kohana местный житель21.02.08 17:26
NEW 21.02.08 17:26 
Ich schreibe auf Deutsch weil es im Moment einfacher ist Ich möchte eine Liste in Visual C++ schnell sortieren. Ich kenne die Funktion SortItems, es ist aber recht langsam. Die Liste wird im Dialog sortiert der mehrere Spalten enthält. Wie kann man die Sortierung beschleunigen? Danke.
#1 
  digital.pilot коренной житель21.02.08 17:28
digital.pilot
NEW 21.02.08 17:28 
в ответ kohana 21.02.08 17:26
заполнять его уже отсортированными данными
#2 
Murr коренной житель21.02.08 19:23
Murr
NEW 21.02.08 19:23 
в ответ digital.pilot 21.02.08 17:28
да и пузырек написать минуты три займет...
#3 
megabyte завсегдатай21.02.08 19:34
megabyte
NEW 21.02.08 19:34 
в ответ Murr 21.02.08 19:23
За три минуты не напишу.. По этому поводу вспомнился анекдот ;-)
В ответ на:
Корреспондент областной газеты решил выявить уровень подготовки
студентов. Он задал студентам разных курсов один вопрос: "Сколько будет
2х2?" Результаты его опроса были следующими: первокурсник с уверенностью
ответил: "четыре"; второкурсник вытащил шпаргалку с таблицей умножения;
третьекурсник достал калькулятор и быстренько сосчитал; четверокурсник
побежал в дисплейный класс составлять программу; а пятикурсник с
негодованием заявил: "Что я, все константы помнить обязан?"

#4 
AlexNek старожил21.02.08 19:36
AlexNek
NEW 21.02.08 19:36 
в ответ kohana 21.02.08 17:26
Похоже Вы имеете набор строк для колонок в лист бохе и пытаетесь сортировать средствами листбоха. Видимо нужно динамическая сортировка по нескольким колонкам.
Для начала сделайте листбох "виртуальным", то есть что бы там данных не было записано, одн делает только отображние контейнера. И сортируйте данные в контейнере. Для этого важно написать функцию сравнения двух записей, а уж методов сортировки можно выбрать.
#5 
kashej постоялец21.02.08 21:24
kashej
NEW 21.02.08 21:24 
в ответ kohana 21.02.08 17:26
quicksort?...
http://denis-aristov.ucoz.com
#6 
  kohana местный житель22.02.08 08:00
NEW 22.02.08 08:00 
в ответ megabyte 21.02.08 19:34
alles klar:-) es it da aber nicht so einfach organisiert. es läuft alles über COM-Schiht und Repository. Aber ich komme schon klar. Danke:-)
#7 
Murr коренной житель22.02.08 14:12
Murr
NEW 22.02.08 14:12 
в ответ megabyte 21.02.08 19:34
За три минуты не напишу..
------
:) - А Я - напишу. Бо, последний раз писал две недели назад и по условиям нельзя было пользоваться никакими либами... до этого - вообще ничего не писал с Июня... Заняло - примерно три минуты, бо, на всю задачу, вместе с ее получением, осознанием, написанием, отладкой и отправкой давался час... а вот сортировку простыми вставками с фильтрацией дублей за это время Я бы не написал - еще минут 15-20 надо было бы...
#8 
  scorpi_ скептик22.02.08 15:05
NEW 22.02.08 15:05 
в ответ Murr 22.02.08 14:12
Время пошло
В ответ на:
#include <algorithm>
#include <boost/tr1/array.hpp>
using std::tr1::array;
#define BOOST_AUTO_TEST_MAIN
#include <boost/test/auto_unit_test.hpp>
template<class Iterator>
void bubble_sort( Iterator First, Iterator Last )
{
// TODO
}
BOOST_AUTO_TEST_CASE( bubble_sort_simple )
{
array< int, 10 > a0 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
array< int, 10 > a1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::random_shuffle( a0.begin(), a0.end() );
bubble_sort( a0.begin(), a0.end() );
BOOST_CHECK_EQUAL( a0 == a1, true );
}
BOOST_AUTO_TEST_CASE( bubble_sort_1_elem )
{
array< int, 1 > a0 = { 0 };
array< int, 1 > a1 = { 0 };
std::random_shuffle( a0.begin(), a0.end() );
bubble_sort( a0.begin(), a0.end() );
BOOST_CHECK_EQUAL( a0 == a1, true );
}
BOOST_AUTO_TEST_CASE( bubble_sort_2_elem )
{
array< int, 2 > a0 = { 0, 1 };
array< int, 2 > a1 = { 0, 1 };
std::random_shuffle( a0.begin(), a0.end() );
bubble_sort( a0.begin(), a0.end() );
BOOST_CHECK_EQUAL( a0 == a1, true );
}
BOOST_AUTO_TEST_CASE( bubble_sort_empty )
{
array< int, 0 > a0 = {};
array< int, 0 > a1 = {};
std::random_shuffle( a0.begin(), a0.end() );
bubble_sort( a0.begin(), a0.end() );
BOOST_CHECK_EQUAL( a0 == a1, true );
}


#9 
Murr коренной житель22.02.08 17:04
Murr
22.02.08 17:04 
в ответ scorpi_ 22.02.08 15:05
А что, так сложно использовать имеющуюся имплементацию?
Или ты хотел, чтобы Я написал еще и две строки компаратора? :)
Кстати, стоило бы внимательнее читать - использование каких либо сторонних либ - запрещено по условиям... :)
Ну если и писать - двойной foreach, компоратор и свапер - ну никак не больше трех минут... :)
#10 
  scorpi_ скептик22.02.08 17:10
NEW 22.02.08 17:10 
в ответ Murr 22.02.08 14:12, Последний раз изменено 22.02.08 17:11 (scorpi_)
Сохраним для истории твой удалённый пост.
В ответ на:

А сортировочка была написана вот так:
        // simple sort procedure
private void doSortArray(int[] largest, int size)
{
for (int i = 0; i < size; ++i)
{
for ( int j = i+1; j < size; ++j)
{
if (largest[ i ] < largest[j])
{
int temp = largest[ i ];
largest[ i ] = largest[j];
largest[j] = temp;
}
}
}
}


И заняло это не более трех минут... ;-)


Замечательно. Только это не пузырёк, это неэффективная реализация selection sort.
#11 
  scorpi_ скептик22.02.08 17:16
NEW 22.02.08 17:16 
в ответ Murr 22.02.08 17:04
В ответ на:
Кстати, стоило бы внимательнее читать - использование каких либо сторонних либ - запрещено по условиям... :)

Твои условия мне по барабану. Во-вторых, где ты видишь сторонние либы? Совершенно generische implementation на итераторах, никаких либ. Все либы только для тестировочной обвязки, не имеющие никакого отношения к алгоритму.
В ответ на:
Ну если и писать - двойной foreach, компоратор и свапер - ну никак не больше трех минут... :)

Я-то напишу. Вот пожалуйста:
В ответ на:
template<class Iterator>
void bubble_sort( Iterator First, Iterator Last )
{
for( --Last; First < Last; ++First )
for( Iterator i = Last; i > First; --i )
if ( *i < *(i - 1) )
std::iter_swap( (i - 1), i );
}


А вот ты как обычно побахвалился впустую.
#12 
  Chipolino свой человек22.02.08 17:17
NEW 22.02.08 17:17 
в ответ scorpi_ 22.02.08 17:10
Что ты пытаешься доказать ? :-)
Что Мурр болтун ? Это и так все знают ...
#13 
Murr коренной житель22.02.08 17:55
Murr
NEW 22.02.08 17:55 
в ответ scorpi_ 22.02.08 17:10
Только это не пузырёк, это неэффективная реализация selection sort.
-----
Да, не пузырек. Для пузырька - int j = 0;
Это - чуток эффективнее, при том же времени реализации. Но(!) там не требовалась наиэффективнейшая реализаци. Требовалось - получить что задано и выполнить имплементацию за заданное время. А времени у меня было мало - минут на 10 превысил лимит на другой задачке...
#14 
Murr коренной житель22.02.08 18:01
Murr
NEW 22.02.08 18:01 
в ответ scorpi_ 22.02.08 17:16
Твои условия мне по барабану.
-----
Были бы мне условия по барабану - Я бы взял коллекцию, сказал что она она сортированная и содержит уникальные элементы и в одном цикле переброски данных, без сортировки, получил бы результат.
#15 
  scorpi_ скептик22.02.08 18:31
NEW 22.02.08 18:31 
в ответ Murr 22.02.08 17:55
В ответ на:
Да, не пузырек. Для пузырька - int j = 0;

Киса, ты ничего не путаешь?
В ответ на:
Это - чуток эффективнее, при том же времени реализации. Но(!) там не требовалась наиэффективнейшая реализаци.

Киса, ты сам завёл разговор о пузырьке. Если б ты сказал - выборкой, я бы и слова не сказал.
Кстати об эффективности и времени реализации. Сортировка вставками пишется вообще в 3 строки, и будет поэффектинее.
В ответ на:
template<class Iterator>
void insertion_sort( Iterator First, Iterator Last )
{
for( Iterator i = First; i < Last; ++i )
for( Iterator j = i; j > First && *j < *(j - 1); --j )
std::iter_swap( (j - 1), j );
}


#16 
Murr коренной житель22.02.08 19:06
Murr
NEW 22.02.08 19:06 
в ответ scorpi_ 22.02.08 18:31
Киса, ты ничего не путаешь?
-----
Вроде как меня учили именно этому - пузырек - тупой двойной цикл...
Кстати об эффективности и времени реализации.
-----
Тебе стоило бы почитать условия того задания. Гарантирую, что там есть решение на несколько порядков более эффективное, чем приводимое, с использованием любой сортировки. У меня просто не было времени на его имплементацию. Но Я уложился в срок и сдал работающий код, т.е. моя эффективность была 100%... а учитывая понимание ограниченности приведенного решения и деталей того, как можно было получить более эффективный код - 120%...
Сортировка вставками пишется вообще в 3 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...
#17 
  scorpi_ скептик22.02.08 19:24
NEW 22.02.08 19:24 
в ответ Murr 22.02.08 19:06
В ответ на:
Киса, ты ничего не путаешь?
-----
Вроде как меня учили именно этому - пузырек - тупой двойной цикл...

Двойной-то он двойной, но второй цикл идёт с конца навстречу первому.
В ответ на:
Сортировка вставками пишется вообще в 3 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...

Посмотри на мой код ещё раз, где ты массив видишь? И зачем бы он вообще был бы нужен?
#18 
Murr коренной житель22.02.08 20:00
Murr
NEW 22.02.08 20:00 
в ответ scorpi_ 22.02.08 19:24
второй цикл идёт с конца навстречу первому.
-----
Блин, запутал... придется смотреть теорию...
где ты массив видишь? И зачем бы он вообще был бы нужен?
-----
Не вижу. А быть должен - в соответствии с названием метода - изъятие из одного массива и вставка, с соблюдением порядка, в другой.
#19 
  scorpi_ скептик22.02.08 20:11
NEW 22.02.08 20:11 
в ответ Murr 22.02.08 20:00
В ответ на:
где ты массив видишь? И зачем бы он вообще был бы нужен?
-----
Не вижу. А быть должен - в соответствии с названием метода - изъятие из одного массива и вставка, с соблюдением порядка, в другой.

Не должен. Сортировка вставками, это поочерёдный просмотр всех элементов со вставкой текущего в правильном месте среди уже отсортированных. Второй цикл, это сдвиг вправо тех элементов, которые больше актуального. При этом можно ещё закешить актуальный элемент, и выпослнять присвоение вместо свопа, но в STL в общем случае присвоение не обязательно быстрее свопа.
#20 
1 2 все