Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Разъяснить 2 строки


Автор: Syltan 21.9.2009, 21:23
Разбираюсь с алгоритмом быстрой сортировки, вроде уже разобрался но не до конца. НЕ могу понять вот эти 2 строки:
Код

 while ( a[i] < p ) i++;
        while ( a[j] > p ) j--;


Что они делают, как их понять?
Вот весь исходник:

Код

#include <iostream>
using namespace std;

//создается шаблнная функция
template<class T> 
// функция принимает аргументы: 
// массив (так как функция шаблонная, то любого типа массив), и кол-во элементов массива.
void quickSortR(T* a, long N) 
{
    long i = 0, j = N;
    // T - это тип передаваемого массива
    // создаем две перменных этого типа
    T temp, p;

     p = a[ N>>1 ];

    // процедура разделения (разделяет массив на подмассивы)
    do {
        while ( a[i] < p ) i++;
        while ( a[j] > p ) j--;

        if (i <= j) 
        {
            // обмен местами элементов a[i] с a[j] 
            // то есть, то что было в a[i] станет в a[j]
            // а то, что было в a[j] станет в a[i]
            temp = a[i]; a[i] = a[j]; a[j] = temp; 
            i++; j--;
        }
    } while ( i<=j );

    // рекурсивные вызовы, если есть, что сортировать
    if ( j > 0 ) quickSortR(a, j); // рекурсивно вызываем функцию
    if ( N > i ) quickSortR(a+i, N-i); // рекурсивно вызываем функцию
  }
// ------------------------------------------------------------------------------
int main()
{
    setlocale(LC_ALL, "Russian");
    // создаем массив символов
    char str[] = "бвгда";
    // сортируем массив символов
    quickSortR(str, strlen(str));
    // выводим на экран отсортированный массив симовлов
    cout << str <<  endl;
    // создаем целочисленный массив
    int a[] = { 2, 5, 1, 20, 8, 0, 9 };
    // сортируем целочисленный массив
    quickSortR(a, 6);
    // выводим на экран отсортированный целочисленный массив
    for(int i = 0; i < 7; i++)
        cout << a[i] << " ";
    cout <<  endl;
    
    system("pause"); 
    return 0; // функция main ДОЛЖНА возвращать число
}

Автор: Данкинг 21.9.2009, 21:29
Как их понять? Ну, цикл до тех пор, пока значение элемента массива a с индексом i меньше значения переменной p. Ну, о второй строчке догадаешься. smile 

Автор: Syltan 21.9.2009, 21:35
А за ним i++ тоесть перейти на следующий элемент масива?
А j--   тогда что?*

Автор: zim22 21.9.2009, 21:37
Цитата(Syltan @  21.9.2009,  21:23 Найти цитируемый пост)
Что они делают, как их понять?

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

Автор: Данкинг 21.9.2009, 21:51
Цитата(Syltan @  21.9.2009,  22:35 Найти цитируемый пост)
А за ним i++ тоесть перейти на следующий элемент масива?

Это увеличение значения переменной i.

Автор: IKM2007 21.9.2009, 21:51
Syltan, читай книжки.

Добавлено @ 21:52
или если лень читать книги, используй гугл и узнаешь какой оператор для чего.

Автор: Syltan 21.9.2009, 22:06
Как запустить пошаговую отладку студия 2005?

Автор: 586 21.9.2009, 22:25
Цитата(Syltan @  21.9.2009,  23:06 Найти цитируемый пост)
Как запустить пошаговую отладку студия 2005?

В меню: Debug->Step Into

Автор: Syltan 21.9.2009, 22:30
Следую вашей инструкции, получаю на экран вот такое при запуске, как теперь я смогу проследить действия программы.

Автор: iRUSH 21.9.2009, 23:02
В данном случае смею предположить что исмользуеться алгоритм quick sort почитать можно http://ru.wikipedia.org/wiki/Быстрая_сортировка
Если ты внимательно вкуришь в написаное(то что по ссылке), то сразу же догадаешься и найдешь решение своей проблеме, а именно:
Код

p = a[ N>>1 ];

Тут мы берем грубо говоря середину массива(опорную точку по алгоритму), далее:
Код

while ( a[i] < p ) i++;
        while ( a[j] > p ) j--;

тут как мы видим идет два цикла, первый от начала к опорной точке, второй наоборот от конца к опорной точке....
Ну а далее по алгоритму действуем...

Автор: 586 22.9.2009, 00:19
Syltan, поставь BreakPoint (Debug->Toggle Breakpoint) на функции main, и запусти отладку (Debug->Start Debugging).
И убедись, что версия проекта Debug а не релиз.

Автор: Syltan 22.9.2009, 00:19
Спасибо,ссылочку я прочитал. Вот смотрите,строка:

Код

while ( a[i] < p ) i++; 


Этим мы производим сравнение каждого элемента масива с серединой масива, выполняя замену,тоесть числа,меньшие  середины масива, переходят в левую сторону. Но вот эта строка:
Код

while ( a[j] > p ) j--; 


Происходит сравнение общего количества элементов масива с серединой масива,тоесть если масив сосстоит из 6 элементов,тогда будет каждый элемент с 6, с конца, спускаясь в низ, сравниваться с серединой масива?

Автор: ller 22.9.2009, 08:25
http://ipicture.ru/Gallery/Viewfull/24105844.html

1. Ставишь дебаг, а не релиз. Это важно.
2. Тыкаешь в поле около нужной строки, появляется знак, breakpoint - точка останова
3. Тыкаешь запустить и у тебя программа останавливается на нужной строке

Автор: zim22 22.9.2009, 08:43
мне кажется эта версия quicksort будет легче для понимания
Код

template <class Item>
void quicksort(Item a[], int l, int r) {
  if (r <= l) return;
  int i = partition(a, l, r);
  quicksort(a, l, i - 1);
  quicksort(a, i + 1, r);
}


template <class Item>
int partition(Item a[], int l, int r) {
  int i = l - 1;
  int j = r; 
  Item v = a[r];

  for (;;) {
    while (a[++i] < v);

    while (v < a[--j]) 
      if (j == l) break;

    if (i >= j) break;
    std::swap(a[i], a[j]);
  }
  std::swap(a[i], a[r]);
  return i;
}

Автор: Syltan 22.9.2009, 17:54
Проверьте, правильно ли я пояснил строку:
Код

    
while ( a[j] > p ) j--; 


Происходит сравнение общего количества элементов масива с серединой масива,тоесть если масив сосстоит из 6 элементов,тогда будет каждый элемент с 6, с конца, спускаясь в низ, сравниваться с серединой масива?

Автор: zim22 22.9.2009, 17:59
Цитата(Syltan @  22.9.2009,  17:54 Найти цитируемый пост)
Проверьте, правильно ли я пояснил строку:

проверять нет ни времени, ни желания.

while работает так: повторяет блок кода до тех пор, пока условие истинно.

Автор: shuttle 23.9.2009, 04:38
Код

while ( a[j] > p ) j--; 
 
j будет уменьшаться пока значение массива больше переменной p. while закончится a[j]<=p.

Автор: bsa 25.9.2009, 13:09

M
bsa
Последние сообщения выделены в отдельную тему


 ! 
bsa
Syltan, в правилах форума русским языком написано: одна тема - один вопрос

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)