Здравствуйте, <Аноним>, Вы писали:
А>Быстрая сортировка
А>Здравствуйте. В книге Кормена про алгоритмы, приведен следующий алгоритм быстрой сортировки на псевдокоде: А>http://img3.freeimagehosting.net/uploads/8c1f866dbf.gif
А>Набил это дело на С++ А>
А> int hoare_partition(elem_type A[], int left, int right)
А> {
А> elem_type pivot = A[left];
А> int i = left - 1;
А> int j = right + 1;
А> while(true)
А> {
А> do
А> {
А> --j;
А> }
А> while(A[j] > pivot);
А> do
А> {
А> ++i;
А> }
А> while(A[i] < pivot);
А> if(i < j)
А> swap(A[i], A[j]);
А> else
А> return j;
А> }
А> }
А>
А>но массив сортируется неправильно. А>Где я туплю? Или у Кормена опечатка/ошибка?
Точно не уверен, но насколько я помню Кнута, должно быть как-то так:
int hoare_partition(elem_type A[], int left, int right)
{
elem_type pivot = A[left];
int i = left/* - 1*/;
int j = right + 1;
while(true)
{
while(A[--j] > pivot);
while(A[++i] < pivot);
if(i < j)
{
swap(A[i], A[j]);
}
else
{
swap(A[left], A[j]);return j;
}
}
//return -1;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Здравствуйте, Аноним, Вы писали:
А>Быстрая сортировка
А>Здравствуйте. В книге Кормена про алгоритмы, приведен следующий алгоритм быстрой сортировки на псевдокоде: А>
Интересно, а это работает, если в массиве есть одинаковые элементы? Мне кажется нет. Ща проверю.
Здравствуйте, Аноним, Вы писали:
А>Быстрая сортировка
А>Здравствуйте. В книге Кормена про алгоритмы, приведен следующий алгоритм быстрой сортировки на псевдокоде: А>
А>Набил это дело на С++ А>
//
// Такой вариант функции мне больше нравиться..
//
void dump( elem_type A[], int sz )
{
std::copy( A, A + sz, std::ostream_iterator<elem_type>( std::cout, " " ) );
std::cout << std::endl;
}
int main(int argc, char* argv[])
{
int vector[] = { 5, 3, 4, 2, 6, 8, 9, 7, 1 };
int sz = sizeof( vector ) / sizeof( vector[0] );
dump( vector, sz );
return (0);
}
Теоретически нет разницы между теорией и практикой, но на практике она есть
Re[2]: Быстрая сортировка
От:
Аноним
Дата:
27.11.07 10:53
Оценка:
Здравствуйте, seimur, Вы писали:
S>// Такой вариант функции мне больше нравиться.. S>
//
S>void dump( elem_type A[], int sz )
S>{
S> std::copy( A, A + sz, std::ostream_iterator<elem_type>( std::cout, " " ) );
S> std::cout << std::endl;
S>}
Чем, если не секрет? Если уж заниматься ерундой, то ИМХО лучше такой вариант
void dump2(elem_type A[], int size)
{
std::for_each(A, A + size, std::cout << boost::lambda::_1);
std::cout << std::endl;
}