Здравствуйте Гость [ Вход | Регистрация ] | Форум в сети 6725-й день

Шановні користувачі! Запрошуємо вас до офіційного телеграм-канала 0day Community. Тут ви зможете поспілкуватися одне з одним та дізнатися про останні новини щодо роботи ресурса, поставити запитання до адміністрації, тощо. Перейти до телеграм-канала можна відсканувавши QR-код або натиснувши на посилання: @zeroday_ua

 С++ для новичков, вопросы, ответы, книги, с чего начать

pokemon4eg
Mar 1 2009, 11:37
  
Пост #1



Репутация:   1  
Дух


Группа: Пользователи
Сообщений: 13
С нами с: 16-August 08


Open in new window - Он придумал С++ hi.gif

Попробуем сделать что-то хорошее для С++ и начинающих программистов smile.gif

В описании раздела программирования есть много языков. В том числе и С++. Правда поиском по форуму по слову "С++" ничего не нашел. Вот и решил сделать тему в которой будем отвечать на вопросы и помогать друг-другу в этом не легком, а порой и очень нервном wink.gif деле smile.gif

С чего начать?
C++ wiki: http://ru.wikipedia.org/wiki/C%2B%2B

Вам понадобится 3 вещи:
1) Google
2) IDE (интегрированная среда разработки)
3) Книга: С++ для чайников: http://forum.0day.kiev.ua/index.php?showtopic=103405

IDE:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Первая программа. Hello C++:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Бесплатные технологи для С++ :
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


По возможности буду выкладывать примеры вот сюда:
http://github.com/k0ndr0ng1thub/0dayForumC...er/CppExamples/ software.gif

Книги:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Сообщение отредактировал pokemon4eg - Dec 3 2009, 17:23
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
Tamplier
Mar 20 2009, 20:18
  
Пост #2


Незарегистрированный







Наиболее часто задаваемые вопросы по С++. Реализация распространенных алгоритмов, решения типовых задач.

Алгоритмы сортировки строк

Сортировка выбором

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


template<class T>
void selectSort(T a[], long size) {
long i, j, k;
T x;

[color=#3333FF]for[/color]( i=0; i < size; i++) { // i - номер текущего шага
k=i; x=a[i];
for( j=i+1; j < size; j++) // цикл выбора наименьшего элемента
if ( a[j] < x ) {
k=j; x=a[j]; // k - индекс наименьшего элемента
}
a[k] = a[i]; a[i] = x; // меняем местами наименьший с a[i]
}
}

Если входная последовательность почти упорядочена, то сравнений будет столько же, значит алгоритм ведет себя неестественно.

Сортировка пузырьком

Идея метода: шаг сортировки состоит в проходе снизу вверх по массиву. По пути просматриваются пары соседних элементов. Если элементы некоторой пары находятся в неправильном порядке, то меняем их местами.


template<class T>
void bubbleSort(T a[], long size) {
  long i, j;
  T x;

  for( i=0; i < size; i++) {            // i - номер прохода
    for( j = size-1; j > i; j-- ) {     // внутренний цикл прохода

      if ( a[j-1] > a[j] ) {
      x=a[j-1]; a[j-1]=a[j]; a[j]=x;
    }
  }
}
}



Дополнительная память, очевидно, не требуется. Поведение усовершенствованного (но не начального) метода довольно естественное, почти отсортированный массив будет отсортирован намного быстрее случайного. Сортировка пузырьком устойчива, однако шейкер-сортировка утрачивает это качество.
На практике метод пузырька, даже с улучшениями, работает слишком медленно. А потому - почти не применяется.

Дополнительная память, очевидно, не требуется. Поведение усовершенствованного (но не начального) метода довольно естественное, почти отсортированный массив будет отсортирован намного быстрее случайного. Сортировка пузырьком устойчива, однако шейкер-сортировка утрачивает это качество.
На практике метод пузырька, даже с улучшениями, работает слишком медленно. А потому - почти не применяется.

Сортировка вставками

Сортировка простыми вставками в чем-то похожа на вышеизложенные методы.

template
void insertSort(T a[], long size) {
  T x;
  long i, j;

  for ( i=0; i < size; i++) {  // цикл проходов, i - номер прохода
    x = a[i];    
    // поиск места элемента в готовой последовательности
    for ( j=i-1; j>=0 && a[j] > x; j--)
      a[j+1] = a[j];      // сдвигаем элемент направо, пока не дошли
    // место найдено, вставить элемент
    a[j+1] = x;
  }
}


Аналогично сортировке выбором, среднее, а также худшее число сравнений и пересылок оцениваются как Theta(n2), дополнительная память при этом не используется.

Хорошим показателем сортировки является весьма естественное поведение: почти отсортированный массив будет досортирован очень быстро. Это, вкупе с устойчивостью алгоритма, делает метод хорошим выбором в соответствующих ситуациях.

Алгоритм можно слегка улучшить. Заметим, что на каждом шаге внутреннего цикла проверяются 2 условия. Можно объединить из в одно, поставив в начало массива специальный сторожевой элемент. Он должен быть заведомо меньше всех остальных элементов массива.


// сортировка вставками со сторожевым элементом
template
inline void insertSortGuarded(T a[], long size) {
T x;
long i, j;
T backup = a[0]; // сохранить старый первый элемент

setMin(a[0]); // заменить на минимальный

// отсортировать массив
for ( i=1; i < size; i++) {
x = a[i];
for ( j=i-1; a[j] > x; j--)
a[j+1] = a[j];
a[j+1] = x;
}
// вставить backup на правильное место
for ( j=1; j< backup; j++)
a[j-1] = a[j];
// вставка элемента
a[j-1] = backup;

}

Функция setmin(T& x) должна быть создана пользователем. Она заменяет x на элемент, заведомо меньший(меньший или равный, если говорить точнее) всех элементов массива.

Сортировка Шелла

Сортировка Шелла является довольно интересной модификацией алгоритма сортировки простыми вставками.

int increment(long inc[], long size) {
  int p1, p2, p3, s;
  p1 = p2 = p3 = 1;

  s = -1;
  do {
    if (++s % 2) {
      inc[s] = 8*p1 - 6*p2 + 1;
    } else {
      inc[s] = 9*p1 - 9*p3 + 1;
      p2 *= 2;
      p3 *= 2;
    }
    p1 *= 2;
  } while(3*inc[s] < size);  

  return s > 0 ? --s : 0;
}

template
void shellSort(T a[], long size) {
  long inc, i, j, seq[40];
  int s;
// вычисление последовательности приращений
  s = increment(seq, size);
  while (s >= 0) {
    // сортировка вставками с инкрементами inc[]
    inc = seq[s--];
    for (i = inc; i < size; i++) {
      T temp = a[i];
      for (j = i-inc; (j >= 0) && (a[j] > temp); j -= inc)
        a[j+inc] = a[j];
        a[j+inc] = temp;
    }
  }
}

Часто вместо вычисления последовательности во время каждого запуска процедуры, ее значения рассчитывают заранее и записывают в таблицу, которой пользуются, выбирая начальное приращение по тому же правилу: начинаем с inc[s-1], если 3*inc[s] > size.

Пирамидальная сортировка

Пирамидальная сортировка является первым из рассматриваемых методов, быстродействие которых оценивается как O(n log n).

template
void downHeap(T a[], long k, long n) {
  //  процедура просеивания следующего элемента
  //  До процедуры: a[k+1]...a[n]  - пирамида
  //  После:  a[k]...a[n]  - пирамида
  T new_elem;
  long child;
  new_elem = a[k];
  while(k <= n/2) {          // пока у a[k] есть дети
    child = 2*k;
    //  выбираем большего сына
    if( child < n && a[child] < a[child+1] )
    child++;
    if( new_elem >= a[child] ) break;
    // иначе
    a[k] = a[child];     // переносим сына наверх
    k = child;
  }
  a[k] = new_elem;
}
template
void heapSort(T a[], long size) {
  long i;
  T temp;
  // строим пирамиду
  for(i=size/2-1; i >= 0; i--) downHeap(a, i, size-1);
  // теперь a[0]...a[size-1] пирамида
  for(i=size-1; i > 0; i--) {
    // меняем первый с последним
    temp=a[i]; a[i]=a[0]; a[0]=temp;
    // восстанавливаем пирамидальность a[0]...a[i-1]
    downHeap(a, 0, i-1);
  }
}

Построение пирамиды занимает O(n log n) операций, причем более точная оценка дает даже O(n) за счет того, что реальное время выполнения downheap зависит от высоты уже созданной части пирамиды.

Вторая фаза занимает O(n log n) времени: O(n) раз берется максимум и происходит просеивание бывшего последнего элемента. Плюсом является стабильность метода: среднее число пересылок (n log n)/2, и отклонения от этого значения сравнительно малы.

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

Сообщение отредактировал Tamplier - Mar 20 2009, 20:31
Go to the top of the page
+Quote Post

Сообщения в этой теме
pokemon4eg   С++ для новичков   Mar 1 2009, 11:37
Phaust   А конкретнее? Посты набиваем?   Mar 1 2009, 11:55
pokemon4eg   А конкретнее? Посты набиваем? А если быть честн...   Mar 2 2009, 9:41
pokemon4eg   :rus: читай маны http://proklondike.com/index.php...   Mar 1 2009, 12:19
Livanias   Мог бы и сюда накидать http://forum.0day.kiev.ua/i...   Mar 2 2009, 0:32
pokemon4eg   Мог бы и сюда накидать [url=http://forum.0day.kie...   Mar 2 2009, 9:27
yartat   По C++ дохрена ссылок и горы печатной литературы. ...   Mar 2 2009, 10:48
pokemon4eg   По C++ дохрена ссылок и горы печатной литературы....   Mar 2 2009, 14:44
BoyKot   якщо автор спеціаліст по темі і має бажання/можлив...   Mar 2 2009, 12:38
Tamplier   Наиболее часто задаваемые вопросы по С++. Реализац...   Mar 20 2009, 20:18
pokemon4eg   Наиболее часто задаваемые вопросы по С++. Реализа...   Nov 19 2009, 1:10
reiten   В обоих исходниках сортировки вставками пропущено ...   Mar 20 2009, 20:30
yartat   Реализация метода "пузырька" в посте Tam...   Mar 20 2009, 22:11
pokemon4eg   В обоих исходниках сортировки вставками пропущено...   Nov 19 2009, 1:48
Sion   Подскажите плиз по поводу - указатели на функцию...   Apr 13 2009, 18:43
reiten   Подскажите плиз по поводу - указатели на функци...   Apr 13 2009, 19:51
ROST   http://msdn.microsoft.com/en-us/library/y81x4ttb.a...   Apr 13 2009, 19:42
Logo   Друг спрашивает по С++: Подскажите как в С++ счит...   Apr 26 2009, 12:17
Celin   ... Зачем заморачиватся с потоковым вводом/выво...   Apr 26 2009, 12:32
reiten   Друг спрашивает по С++: Подскажите как в С++ счи...   Apr 26 2009, 13:21
pokemon4eg   при вводе символа вместо цыфры программа сама про...   Nov 19 2009, 3:15
pokemon4eg   Друг спрашивает по С++: Подскажите как в С++ счи...   Nov 19 2009, 15:16
gryzovick   Ап тему, в поиске информации для изучения с 0я   Oct 6 2021, 14:24
G3n3k   Ап тему, в поиске информации для изучения с 0я ...   Oct 22 2021, 22:29
Бананчик   Классикой обучения с нуля С++ всегда остается кни...   Oct 26 2021, 13:44
G3n3k   а в итоге работу не получить... и годы непосильно...   Oct 29 2021, 22:19
Бананчик   ХР должен обратить на вас внимание и тд - это уже ...   Nov 13 2021, 21:50
Logo   Пробовали даже так: #include <stdio.h> ...   Apr 26 2009, 12:59
ROST   А так? #include <iostream> using namespac...   Apr 26 2009, 13:13
Logo   // как сделать такой примитив // с защито й от дур...   Apr 26 2009, 13:52
ROST   Можна зробити так: #include <iostream> #in...   Apr 26 2009, 14:44
Logo   Отлично в Visual Studio 2008 , Но в Borland С++ Bu...   Apr 26 2009, 15:20
Charge   Warning - не error ;) Определи i как беззнаковое ц...   Apr 26 2009, 17:24
The_David   Можна например так: int iio(int *val, cha...   May 10 2009, 22:36
Monti_berns   Ребят, я понимаю что вопрос тупой. Сори. Но я хоте...   Sep 30 2009, 19:07
kerovnik   Ребят, я понимаю что вопрос тупой. Сори. Но я хот...   Oct 17 2009, 11:26
kap1ec   Я бы посоветовал "Язык программирования C++...   Oct 30 2021, 8:34
G3n3k   Ну, мы ж этого не знаем :) Может под человека уже ...   Nov 17 2021, 10:20
Бананчик   "только выучи и будешь пилить"это входит...   Nov 17 2021, 15:44
tantan   Привет, я сам по себе охотник и очень люблю на охо...   Nov 28 2022, 12:04


Reply to this topicStart new topic

 



- Упрощённая версия
Сейчас: 13th August 2024 - 11:43
Сайт не розміщує електронні версії творів, а займається лише колекціонуванням та каталогізацією посилань, що публікуються нашими користувачами. Якщо Ви є правовласником якоїсь частини опублікованого матеріалу та не бажаєте, щоб посилання на нього знаходилось в нашому каталозі, зв’яжіться з нами і ми видалимо його. Файли для обміну надані користувачами сайту і адміністрація не несе відповідальності за їх вміст.