Вход на сайт
schnelle Sortierung
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 строки
------
Сортировка простыми вставками подразумевает наличие второго массива...
Посмотри на мой код ещё раз, где ты массив видишь? И зачем бы он вообще был бы нужен?
NEW 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 в общем случае присвоение не обязательно быстрее свопа.
NEW 22.02.08 20:11
в ответ scorpi_ 22.02.08 19:24
но второй цикл идёт с конца навстречу первому.
-----
Смотри тут: http://www.intuit.ru/department/algorithms/algocombi/14/2.html
Второй (внутренний) цикл вообще не зависит от первого цикла - просто тупо гоняется перебор смежных пар пока есть перестановки. А так как есть гарантия для N^2, то просто пишутся два цикла до N... Остальное - модификаци, сокращающие количество сравниваемых пар...
-----
Смотри тут: http://www.intuit.ru/department/algorithms/algocombi/14/2.html
Второй (внутренний) цикл вообще не зависит от первого цикла - просто тупо гоняется перебор смежных пар пока есть перестановки. А так как есть гарантия для N^2, то просто пишутся два цикла до N... Остальное - модификаци, сокращающие количество сравниваемых пар...
NEW 22.02.08 20:30
Естественно, можно написать два полных цикла, со всплыванием большего элемента:
Но для этого надо быть совсем тупым... Обычно везде приводят встречные циклы.
Объясни мне плиз разницу (и дай ссылки) между "сортировка простыми вставками" и "сортировка вставками".
в ответ Murr 22.02.08 20:11
В ответ на:
Смотри тут: http://www.intuit.ru/department/algorithms/algocombi/14/2.html
Второй (внутренний) цикл вообще не зависит от первого цикла - просто тупо гоняется перебор смежных пар пока есть перестановки. А так как есть гарантия для N^2, то просто пишутся два цикла до N... Остальное - модификаци, сокращающие количество сравниваемых пар...
Смотри тут: http://www.intuit.ru/department/algorithms/algocombi/14/2.html
Второй (внутренний) цикл вообще не зависит от первого цикла - просто тупо гоняется перебор смежных пар пока есть перестановки. А так как есть гарантия для N^2, то просто пишутся два цикла до N... Остальное - модификаци, сокращающие количество сравниваемых пар...
Естественно, можно написать два полных цикла, со всплыванием большего элемента:
В ответ на:
template<class Iterator>
void bubble_sort( Iterator First, Iterator Last )
{
for( Iterator i = First; i < Last; ++i )
for( Iterator j = First; j < Last - 1; ++j )
if ( *j > *(j + 1) )
std::iter_swap( (j + 1), j );
}
Но для этого надо быть совсем тупым... Обычно везде приводят встречные циклы.
В ответ на:
Ну на разницу в одно слово хорошие программеры внимания не обращают.... :)
В сортировке простыми вставками вставки выполняются в новый массив, уменьшая число сдвигаемых элементов.
Ну на разницу в одно слово хорошие программеры внимания не обращают.... :)
В сортировке простыми вставками вставки выполняются в новый массив, уменьшая число сдвигаемых элементов.
Объясни мне плиз разницу (и дай ссылки) между "сортировка простыми вставками" и "сортировка вставками".
NEW 22.02.08 20:47
Ещё раз для полной ясности. Пузырек делается либо с погружением наименьшего элемента:
либо со всплыванием наибольшего:
В ответ на:
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 );
}
либо со всплыванием наибольшего:
В ответ на:
template<class Iterator>
void bubble_sort( Iterator First, Iterator Last )
{
while( First < --Last )
for( Iterator i = First; i < Last; ++i )
if ( *i > *(i + 1) )
std::iter_swap( (i + 1), i );
}
NEW 22.02.08 21:33
в ответ scorpi_ 22.02.08 20:30
Но для этого надо быть совсем тупым...
------
Или быть в жестком цейтноте, когда на обдумывание времени просто нет...
Обычно везде приводят встречные циклы.
------
Но это уже не базовый пузырек.
Объясни мне плиз разницу (и дай ссылки) между
-----
Насколько Я помню - Д.Кнут. Том 3.
http://www.intuit.ru/department/pl/plpascal/4/
Обрати внимание на примечание в конце описания.
------
Или быть в жестком цейтноте, когда на обдумывание времени просто нет...
Обычно везде приводят встречные циклы.
------
Но это уже не базовый пузырек.
Объясни мне плиз разницу (и дай ссылки) между
-----
Насколько Я помню - Д.Кнут. Том 3.
http://www.intuit.ru/department/pl/plpascal/4/
Обрати внимание на примечание в конце описания.
NEW 22.02.08 22:03
Вполне базовый.
Ну посмотрел. Ничего там про два массива нет. Вообще говоря Кнут в вопросе сортировок несколько устарел, ибо после написания третьего тома в этой области кое-что продвинулось. Конкретно по вставкам - он рассматривает простые вставки, бинарные и Шелла. О бинарных собственно давно уже никто не вспоминает, ибо двигать элементы всё равно надо, Шелла с тех пор уже досконально изучили с целью нахождения идеальной последовательности шагов, и во всех современных книгах он рассматривается совершенно отдельно. Так что никто в современной литературе между "простыми" и "непростыми" вставками не различает. Короче говоря - в данном вопросе лучше изучать что-нибудь посвежее, хотя бы Седжвика (он кстати ученик Кнута).
В ссылке также ничего про второй массив нет нет.
в ответ Murr 22.02.08 21:33
В ответ на:
Обычно везде приводят встречные циклы.
------
Но это уже не базовый пузырек.
Обычно везде приводят встречные циклы.
------
Но это уже не базовый пузырек.
Вполне базовый.
В ответ на:
Объясни мне плиз разницу (и дай ссылки) между
-----
Насколько Я помню - Д.Кнут. Том 3.
http://www.intuit.ru/department/pl/plpascal/4/
Обрати внимание на примечание в конце описания.
Объясни мне плиз разницу (и дай ссылки) между
-----
Насколько Я помню - Д.Кнут. Том 3.
http://www.intuit.ru/department/pl/plpascal/4/
Обрати внимание на примечание в конце описания.
Ну посмотрел. Ничего там про два массива нет. Вообще говоря Кнут в вопросе сортировок несколько устарел, ибо после написания третьего тома в этой области кое-что продвинулось. Конкретно по вставкам - он рассматривает простые вставки, бинарные и Шелла. О бинарных собственно давно уже никто не вспоминает, ибо двигать элементы всё равно надо, Шелла с тех пор уже досконально изучили с целью нахождения идеальной последовательности шагов, и во всех современных книгах он рассматривается совершенно отдельно. Так что никто в современной литературе между "простыми" и "непростыми" вставками не различает. Короче говоря - в данном вопросе лучше изучать что-нибудь посвежее, хотя бы Седжвика (он кстати ученик Кнута).
В ссылке также ничего про второй массив нет нет.
NEW 22.02.08 22:27
в ответ scorpi_ 22.02.08 22:03
Вполне базовый.
-----
Базовый - смежные пары и тупой перебор. Именно так, как описано по приведенной ссылке.
в данном вопросе лучше изучать что-нибудь посвежее
-----
А нужно ли? Если писать самому - вполне достаточно тупого пузырька.
Для чего-то более сложного - либы. По крайней мере некоторые из сортировок Я не
возьмусь писать с нуля и по памяти - просто не помню всех деталей... Хотя когда-то писал все доступные...
Ничего там про два массива нет.
В ссылке также ничего про второй массив нет нет.
-----
Да, там один массив. Правда - второй. Вот про первый - там ничего нет, кроме ссылки на то, что данные надо последовательно откуда-то брать.
-----
Базовый - смежные пары и тупой перебор. Именно так, как описано по приведенной ссылке.
в данном вопросе лучше изучать что-нибудь посвежее
-----
А нужно ли? Если писать самому - вполне достаточно тупого пузырька.
Для чего-то более сложного - либы. По крайней мере некоторые из сортировок Я не
возьмусь писать с нуля и по памяти - просто не помню всех деталей... Хотя когда-то писал все доступные...
Ничего там про два массива нет.
В ссылке также ничего про второй массив нет нет.
-----
Да, там один массив. Правда - второй. Вот про первый - там ничего нет, кроме ссылки на то, что данные надо последовательно откуда-то брать.
NEW 22.02.08 23:53
Это твой выбор. Мне лично пузырька недостаточно.
Конкретно из того что было придумано после Кнута и реально используется - introsort, in-place mergesort, вариант heapsort'а в среднем более быстрого чем quicksort. Это из внутренних сортировок. А уж зарекаться насчёт внешних сортировок, что не придётся их писать, я тем более не стану.
в ответ Murr 22.02.08 22:27
В ответ на:
А нужно ли? Если писать самому - вполне достаточно тупого пузырька.
Для чего-то более сложного - либы. По крайней мере некоторые из сортировок Я не
возьмусь писать с нуля и по памяти - просто не помню всех деталей... Хотя когда-то писал все доступные...
А нужно ли? Если писать самому - вполне достаточно тупого пузырька.
Для чего-то более сложного - либы. По крайней мере некоторые из сортировок Я не
возьмусь писать с нуля и по памяти - просто не помню всех деталей... Хотя когда-то писал все доступные...
Это твой выбор. Мне лично пузырька недостаточно.
Конкретно из того что было придумано после Кнута и реально используется - introsort, in-place mergesort, вариант heapsort'а в среднем более быстрого чем quicksort. Это из внутренних сортировок. А уж зарекаться насчёт внешних сортировок, что не придётся их писать, я тем более не стану.
NEW 23.02.08 00:21
в ответ scorpi_ 22.02.08 23:53
Это твой выбор.
-----
Разумеется.
И если будет необходимо именно писать одну из перечисленных тобой сортировок - Я увенрен, что Я ее напишу.
Но если мне надо иметь отсортированные данные и нет времени писать - пузырек, с минимальными модификациями. Будет необходимость - можно заменить позднее.
-----
Разумеется.
И если будет необходимо именно писать одну из перечисленных тобой сортировок - Я увенрен, что Я ее напишу.
Но если мне надо иметь отсортированные данные и нет времени писать - пузырек, с минимальными модификациями. Будет необходимость - можно заменить позднее.