Вход на сайт
schnelle Sortierung
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.
NEW 21.02.08 19:34
в ответ Murr 21.02.08 19:23
За три минуты не напишу.. По этому поводу вспомнился анекдот ;-)
В ответ на:
Корреспондент областной газеты решил выявить уровень подготовки
студентов. Он задал студентам разных курсов один вопрос: "Сколько будет
2х2?" Результаты его опроса были следующими: первокурсник с уверенностью
ответил: "четыре"; второкурсник вытащил шпаргалку с таблицей умножения;
третьекурсник достал калькулятор и быстренько сосчитал; четверокурсник
побежал в дисплейный класс составлять программу; а пятикурсник с
негодованием заявил: "Что я, все константы помнить обязан?"
Корреспондент областной газеты решил выявить уровень подготовки
студентов. Он задал студентам разных курсов один вопрос: "Сколько будет
2х2?" Результаты его опроса были следующими: первокурсник с уверенностью
ответил: "четыре"; второкурсник вытащил шпаргалку с таблицей умножения;
третьекурсник достал калькулятор и быстренько сосчитал; четверокурсник
побежал в дисплейный класс составлять программу; а пятикурсник с
негодованием заявил: "Что я, все константы помнить обязан?"
NEW 21.02.08 19:36
в ответ kohana 21.02.08 17:26
Похоже Вы имеете набор строк для колонок в лист бохе и пытаетесь сортировать средствами листбоха. Видимо нужно динамическая сортировка по нескольким колонкам.
Для начала сделайте листбох "виртуальным", то есть что бы там данных не было записано, одн делает только отображние контейнера. И сортируйте данные в контейнере. Для этого важно написать функцию сравнения двух записей, а уж методов сортировки можно выбрать.
Для начала сделайте листбох "виртуальным", то есть что бы там данных не было записано, одн делает только отображние контейнера. И сортируйте данные в контейнере. Для этого важно написать функцию сравнения двух записей, а уж методов сортировки можно выбрать.
NEW 22.02.08 14:12
в ответ megabyte 21.02.08 19:34
За три минуты не напишу..
------
:) - А Я - напишу. Бо, последний раз писал две недели назад и по условиям нельзя было пользоваться никакими либами... до этого - вообще ничего не писал с Июня... Заняло - примерно три минуты, бо, на всю задачу, вместе с ее получением, осознанием, написанием, отладкой и отправкой давался час... а вот сортировку простыми вставками с фильтрацией дублей за это время Я бы не написал - еще минут 15-20 надо было бы...
------
:) - А Я - напишу. Бо, последний раз писал две недели назад и по условиям нельзя было пользоваться никакими либами... до этого - вообще ничего не писал с Июня... Заняло - примерно три минуты, бо, на всю задачу, вместе с ее получением, осознанием, написанием, отладкой и отправкой давался час... а вот сортировку простыми вставками с фильтрацией дублей за это время Я бы не написал - еще минут 15-20 надо было бы...
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 );
}
NEW 22.02.08 17:04
в ответ scorpi_ 22.02.08 15:05
А что, так сложно использовать имеющуюся имплементацию?
Или ты хотел, чтобы Я написал еще и две строки компаратора? :)
Кстати, стоило бы внимательнее читать - использование каких либо сторонних либ - запрещено по условиям... :)
Ну если и писать - двойной foreach, компоратор и свапер - ну никак не больше трех минут... :)
Или ты хотел, чтобы Я написал еще и две строки компаратора? :)
Кстати, стоило бы внимательнее читать - использование каких либо сторонних либ - запрещено по условиям... :)
Ну если и писать - двойной foreach, компоратор и свапер - ну никак не больше трех минут... :)
NEW 22.02.08 17:10
Сохраним для истории твой удалённый пост.
Замечательно. Только это не пузырёк, это неэффективная реализация selection sort.
В ответ на:
А сортировочка была написана вот так:
А сортировочка была написана вот так:
// 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.
NEW 22.02.08 17:16
Твои условия мне по барабану. Во-вторых, где ты видишь сторонние либы? Совершенно generische implementation на итераторах, никаких либ. Все либы только для тестировочной обвязки, не имеющие никакого отношения к алгоритму.
Я-то напишу. Вот пожалуйста:
А вот ты как обычно побахвалился впустую.
в ответ Murr 22.02.08 17:04
В ответ на:
Кстати, стоило бы внимательнее читать - использование каких либо сторонних либ - запрещено по условиям... :)
Кстати, стоило бы внимательнее читать - использование каких либо сторонних либ - запрещено по условиям... :)
Твои условия мне по барабану. Во-вторых, где ты видишь сторонние либы? Совершенно generische implementation на итераторах, никаких либ. Все либы только для тестировочной обвязки, не имеющие никакого отношения к алгоритму.
В ответ на:
Ну если и писать - двойной foreach, компоратор и свапер - ну никак не больше трех минут... :)
Ну если и писать - двойной 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 );
}
А вот ты как обычно побахвалился впустую.
NEW 22.02.08 17:55
в ответ scorpi_ 22.02.08 17:10
Только это не пузырёк, это неэффективная реализация selection sort.
-----
Да, не пузырек. Для пузырька - int j = 0;
Это - чуток эффективнее, при том же времени реализации. Но(!) там не требовалась наиэффективнейшая реализаци. Требовалось - получить что задано и выполнить имплементацию за заданное время. А времени у меня было мало - минут на 10 превысил лимит на другой задачке...
-----
Да, не пузырек. Для пузырька - int j = 0;
Это - чуток эффективнее, при том же времени реализации. Но(!) там не требовалась наиэффективнейшая реализаци. Требовалось - получить что задано и выполнить имплементацию за заданное время. А времени у меня было мало - минут на 10 превысил лимит на другой задачке...
NEW 22.02.08 18:31
Киса, ты ничего не путаешь?
Киса, ты сам завёл разговор о пузырьке. Если б ты сказал - выборкой, я бы и слова не сказал.
Кстати об эффективности и времени реализации. Сортировка вставками пишется вообще в 3 строки, и будет поэффектинее.
в ответ Murr 22.02.08 17:55
В ответ на:
Да, не пузырек. Для пузырька - int j = 0;
Да, не пузырек. Для пузырька - 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 );
}
NEW 22.02.08 19:06
в ответ scorpi_ 22.02.08 18:31
Киса, ты ничего не путаешь?
-----
Вроде как меня учили именно этому - пузырек - тупой двойной цикл...
Кстати об эффективности и времени реализации.
-----
Тебе стоило бы почитать условия того задания. Гарантирую, что там есть решение на несколько порядков более эффективное, чем приводимое, с использованием любой сортировки. У меня просто не было времени на его имплементацию. Но Я уложился в срок и сдал работающий код, т.е. моя эффективность была 100%... а учитывая понимание ограниченности приведенного решения и деталей того, как можно было получить более эффективный код - 120%...
Сортировка вставками пишется вообще в 3 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...
-----
Вроде как меня учили именно этому - пузырек - тупой двойной цикл...
Кстати об эффективности и времени реализации.
-----
Тебе стоило бы почитать условия того задания. Гарантирую, что там есть решение на несколько порядков более эффективное, чем приводимое, с использованием любой сортировки. У меня просто не было времени на его имплементацию. Но Я уложился в срок и сдал работающий код, т.е. моя эффективность была 100%... а учитывая понимание ограниченности приведенного решения и деталей того, как можно было получить более эффективный код - 120%...
Сортировка вставками пишется вообще в 3 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...
NEW 22.02.08 19:24
Двойной-то он двойной, но второй цикл идёт с конца навстречу первому.
Посмотри на мой код ещё раз, где ты массив видишь? И зачем бы он вообще был бы нужен?
в ответ Murr 22.02.08 19:06
В ответ на:
Киса, ты ничего не путаешь?
-----
Вроде как меня учили именно этому - пузырек - тупой двойной цикл...
Киса, ты ничего не путаешь?
-----
Вроде как меня учили именно этому - пузырек - тупой двойной цикл...
Двойной-то он двойной, но второй цикл идёт с конца навстречу первому.
В ответ на:
Сортировка вставками пишется вообще в 3 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...
Сортировка вставками пишется вообще в 3 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...
Посмотри на мой код ещё раз, где ты массив видишь? И зачем бы он вообще был бы нужен?
22.02.08 20:00
в ответ scorpi_ 22.02.08 19:24
второй цикл идёт с конца навстречу первому.
-----
Блин, запутал... придется смотреть теорию...
где ты массив видишь? И зачем бы он вообще был бы нужен?
-----
Не вижу. А быть должен - в соответствии с названием метода - изъятие из одного массива и вставка, с соблюдением порядка, в другой.
-----
Блин, запутал... придется смотреть теорию...
где ты массив видишь? И зачем бы он вообще был бы нужен?
-----
Не вижу. А быть должен - в соответствии с названием метода - изъятие из одного массива и вставка, с соблюдением порядка, в другой.
NEW 22.02.08 20:11
Не должен. Сортировка вставками, это поочерёдный просмотр всех элементов со вставкой текущего в правильном месте среди уже отсортированных. Второй цикл, это сдвиг вправо тех элементов, которые больше актуального. При этом можно ещё закешить актуальный элемент, и выпослнять присвоение вместо свопа, но в STL в общем случае присвоение не обязательно быстрее свопа.
в ответ Murr 22.02.08 20:00
В ответ на:
где ты массив видишь? И зачем бы он вообще был бы нужен?
-----
Не вижу. А быть должен - в соответствии с названием метода - изъятие из одного массива и вставка, с соблюдением порядка, в другой.
где ты массив видишь? И зачем бы он вообще был бы нужен?
-----
Не вижу. А быть должен - в соответствии с названием метода - изъятие из одного массива и вставка, с соблюдением порядка, в другой.
Не должен. Сортировка вставками, это поочерёдный просмотр всех элементов со вставкой текущего в правильном месте среди уже отсортированных. Второй цикл, это сдвиг вправо тех элементов, которые больше актуального. При этом можно ещё закешить актуальный элемент, и выпослнять присвоение вместо свопа, но в STL в общем случае присвоение не обязательно быстрее свопа.