воскресенье, 19 сентября 2010 г.
Сортировка Шелла (Shell_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
Реализация:
Данная сортировка является модификацией сортировки вставками.
Сортировка с помощью бинарного дерева (Tree_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Реализация:
В своей реализации эта сортировка использует структуру данных: бинарное дерево, каждый элемент которого можно описать следующим образом:
- struct tree
- {
- tree* left; // левый сын
- tree* right; // правый сын
- int value; // значение
- };
* This source code was highlighted with Source Code Highlighter.
суббота, 18 сентября 2010 г.
Сортировка слиянием (Merge_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
воскресенье, 12 сентября 2010 г.
Гномья сортировка (Gnome_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Реализация:
- void gnome_sort(vector<int> &mas)
- {
- int cur = 0;
- while (cur + 1 < mas.size())
- {
- if (mas[cur]<=mas[cur+1])
- cur++;
- else
- {
- swap(mas[cur],mas[cur+1]);
- cur--;
- if (cur<0) cur = 0;
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
Сортировка выбором(Selection_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
Реализация:
- void selection_sort(vector<int> &mas)
- {
- for (int i=0;i<mas.size();i++)
- for (int j=i+1;j<mas.size();j++)
- if (mas[i]>mas[j])
- swap(mas[i],mas[j]);
- }
* This source code was highlighted with Source Code Highlighter.
UPD[29.09.2011]
- void selection_sort(vector<int> &mas) {
- for(int i=0;i<mas.size();i++) {
- int minPos = i;
- for(int j=i+1;j<mas.size();j++)
- if(mas[minPos] > mas[j])
- minPos = j;
- swap(mas[minPos],mas[i]);
- }
- }
* This source code was highlighted with Source Code Highlighter.
P.S: Из всех квадратичных сортировок сортировка выбором имеет самую локаничную запись и сложность O(n*(n-1)/2). Вот почему, мне она нравится больше других квадратичных сортировок)
Сортировка вставками (Insert_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
Реализация:
- void insert_sort(vector<int> &mas) {
- for (int i=1;i<n;++i) {
- for (int j=i;j>0;j--) {
- if (mas[j-1] > mas[j])
- swap(mas[j-1],mas[j]);
- else
- break;
- }
- }
- }
* This source code was highlighted with Source Code Highlighter.
Шейкерная сортировка (Cocktail_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Реализация:
- void cocktail_sort(vector<int> &mas)
- {
- int l = 0, r = mas.size()-1;
- while (l<=r)
- {
- // всплывает самый "легкий" элемент
- for (int i = r ;i>l;i--)
- if (mas[i-1]>mas[i])
- swap(mas[i-1],mas[i]);
- l++;
- // тонет самый "тяжелый элемент"
- for (int i=l; i<r; i++)
- if (mas[i]>mas[i+1])
- swap(mas[i],mas[i+1]);
- r--;
- }
- }
* This source code was highlighted with Source Code Highlighter.
суббота, 11 сентября 2010 г.
Пузырьковая сортировка (Bubble_sort)
Теория: Общая информация изложена здесь
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]
Реализация:
- void bubble_sort(vector<int> &mas)
- {
- for (int i=1;i<mas.size();i++)
- for (int j = mas.size()-1;j>=i;j--)
- if (mas[j-1]>mas[j])
- swap(mas[j-1],mas[j]);
- }
* This source code was highlighted with Source Code Highlighter.
N^N mod 10^P
[Вся длинная арифметика]
В завершении обзора задач на длинную арифметику рассмотрим эту интересную задачу. Часто при работе с длинными числами бывает нужно получить не все число целиком, а только несколько последних цифр. В таких задачах даже порой можно обойтись вообще без длинной арифметики.
По условию задачи 1<=N<=1e9 и 1<=P<=100.
Квадратный корень из длинного числа
[Вся длинная арифметика]
Эта задача далась мне тяжелее всех. Наверное потому, что я пытался зачесть ее на acm.sgu.ru и acmp.ru, где ограничения на количество разрядов в числе 1000 и 3000 соответственно. Для начала зачтем эту задачу на informatics.mccme.ru, где ограничение всего 100.
Здесь можно пойти двумя путями:
воскресенье, 5 сентября 2010 г.
Длинное - короткое
До того момента, пока не столкнулся с извлечением квадратного корня из длинного числа, был уверен, что реализация этой операции не будет иметь никакого практического значения. Но я ошибался.
Приведенная реализация практически идентична с реализацией операции “длинное + короткое”:
- BigInt operator - (const BigInt &a, const int &b)
- {
- BigInt res = a;
- int pos = 0;
- res.digits[0] -= b;
- while (res.digits[pos] < 0)
- {
- res.digits[pos+1] --;
- res.digits[pos++] +=osn;
- }
- if (res.amount && !res.digits[res.amount-1])
- res.amount--;
- return res;
- }
* This source code was highlighted with Source Code Highlighter.
Сортировки
Квадратичные сортировки O(N*N):
Пузырьковая (Bubble sort) +
Шейкерная (Cocktail sort) +
Вставками (Insert sort) +
Гномья (Gnome sort) +
Выбором (Selection sort) +
Квазилинейные O(N*log(N)):
Слиянием (Merge sort) +
С помощью двоичного дерева (Tree sort) -
Сортировка Шелла (Shell sort) -
Пирамидальная (Heap sort) -
Плавная (Smooth sort) -
Быстрая (Quick sort) -
STL C++ (Intro sort) -
Python сортировка (Tim sort) +
Линейные O(N):
Подсчетом (Counting sort) +
Карманная (Bucket sort) +
Поразрядная (Radix sort) -
* Плюсом отмечены стабильные сортировки
Факториал короткого числа
Тип int может поместить в себя не больше 12!.А как же нам быть если нужно найти 100! ? Самое время обратиться к длинной арифметике.
Сама реализация не представляет для нас ничего нового:
- BigInt fact(int n)
- {
- BigInt res(1);
- for (int i=2;i<=n;i++)
- res = res * i;
- return res;
- }
* This source code was highlighted with Source Code Highlighter.
По условию задачи n<=3000. В качестве osn лучше выбрать 10000, т.к. в таком случае мы сможем обойтись умножением длинного на короткое.
Пирамидальная сортировка (Heap Sort)
[Все сортировки]
Теория: читаем дивную статью с картинками
Практика: informatics.mccme.ru
Визуализатор: rain.ifmo.ru [Java]