singlepost

быстрая сортировка << На главную или назад  

Вообщем проблема в том, что при сортировке массива из 6 элементов, один элемент теряется. Пробовал для массива из 4,5,7,8,9 элементов работает. В чем ошибка?

void qSort( int *x, int N ){
int i = 0, j = N;
int temp, p;
p = x[N>>1];
do{
while( x[i] < p ) i++;
while( x[j] > p ) j–;
if ( i <= j ){
temp = x[i];
x[i] = x[j];
x[j] = temp;
i++;
j–;
}
} while ( i <= j );
if ( j > 0 ) qSort ( x, j );
if ( N > i ) qSort ( x + i, N – i );

}

30 ответов в теме “быстрая сортировка”

  1. 20
    Никита Миклушов ответил:

    stl::qsort()

  2. 19
    Пашка Джиоев ответил:

    ААА, в первом посте же написал
    =================
    ошибка м.б. в том, что если массив у тебя длины N,
    то эту функцию надо вызывать qSort( x, N-1)
    ++++++++++++++++++
    Т.е. надо писать qSort( a, 5)
    Так работает все.

  3. 18
    Mihan Иванов ответил:

    Спасибо ребята огромное!

  4. 17
    Пашка Джиоев ответил:

    А можешь всю программу привести(с main-ом и т.д.)?

  5. 16
    Mihan Иванов ответил:

    спасибо конечно за код. а насчет моего не знаешь почему такое может быть? может просто надо не do while, а while/

  6. 15
    Mihan Иванов ответил:

    ща

  7. 14
    Mihan Иванов ответил:

    int main()
    {
    int a[10];
    for ( int i = 0; i < 6; i++ ){
    a[i] = rand()/100000;
    cout << a[i] << "";
    }
    qSort(a, 6);
    cout << endl << endl;
    for ( int i = 0; i < 6; i++ )
    cout << a[i] << "";
    return 0;
    }

  8. 13
    Тоша Мартынов ответил:

    первый элемент, который смотрится в строчке while( x[j] > p ) j–; у Вас за пределами массива. получается сравнивается x[6] с чем-то.

  9. 12
    Mihan Иванов ответил:

    вот что еще заметил, что когда 6 елементов заполняю рандомно, то олин пропалает, а когда допустим определенными значениями, то не пропадает.

  10. 11
    Пашка Джиоев ответил:

    У меня есть работающий вариант,
    правда тут передаются индексы начала и конца:

    void Sort( int* x,
    int begin, int end)
    {
    if ( begin >= end )
    {
    return;
    }
    int i = begin, j = end;
    int m = x[begin + rand() % (end - begin + 1)];
    int tmp;
    while ( i <= j )
    {
    while ( x[i] < m ) ++i;
    while ( x[j] > m ) –j;
    if ( i <= j )
    {
    tmp = x[i];
    x[i] = x[j];
    x[j] = tmp;
    ++i;
    –j;
    }
    }
    Sort( x, begin, j);
    Sort( x, i, end);
    }

  11. 10
    Mihan Иванов ответил:

    while ( x[i] < m ) ++i;
    while ( x[j] > m ) –j;

    если знаки наоборот поставить, то будет сортировать поубыванию?

  12. 9
    Пашка Джиоев ответил:

    Какие знаки? <>? Вообще да.

  13. 8
    Mihan Иванов ответил:

    я знаки поменял в своем коде, у меня перестало работать для массивов с четным числом элементов.

  14. 7
    Mihan Иванов ответил:

    ага

  15. 6
    Пашка Джиоев ответил:

    А что значит пропадает? Меняется на какой-то другой?
    Вроде на первый взгляд все правильно,
    ошибка м.б. в том, что если массив у тебя длины N,
    то эту функцию надо вызывать qSort( x, N-1)

  16. 5
    Mihan Иванов ответил:

    заполнил массив5; 4; 5; 4; 5.
    отсортировало все правильно! =)

  17. 4
    Mihan Иванов ответил:

    пропадает, ну типа как обычно когда вылазеет за пределы памяти, то там всякая чушь с минусом получается.

  18. 3
    Mihan Иванов ответил:

    нет я заполнял
    rand();

  19. 2
    Тоша Мартынов ответил:

    введи вручную последовательность, скажем… 5,5,5,5,5, скорей всего программа будет работать неправильно. у Вас не определено что вы делаете с одинаковыми элементами.

  20. 1
    Тоша Мартынов ответил:

    там в последовательности из 6 элементов были равные?)))

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.