Показаны сообщения с ярлыком sort. Показать все сообщения
Показаны сообщения с ярлыком sort. Показать все сообщения

понедельник, 26 сентября 2011 г.

Поразрядная сортировка (Radix_sort)

[Все сортировки]

Теория: Wikipedia

Практика: acmp.ru

Реализация:

Условимся, что мы обрабатываем только массив неотрицательных целых чисел.

Первая реализация обрабатывает разряды десятичного числа начиная с младших. Количество разрядов в числе задается в константе RADIX_AMOUNT.

  1. typedef unsigned int UINT;
  2. . . .
  3. void radix_sort10(UINT* &a, int size) {
  4.   UINT* b = new UINT[size];
  5.   UINT* title = new UINT[10];
  6.   UINT* count = new UINT[10];
  7.   UINT* prev = new UINT[size];
  8.  
  9.   memset(count,0,sizeof(UINT) * 10);
  10.   char curDig;
  11.   int osn = 10;
  12.   int del = 1;
  13.   for (int r=0;r<RADIX_AMOUNT;r++) {
  14.     for (int i=0;i<size;i++) {
  15.       curDig = (a[i] % osn) / del;
  16.       prev[i] = title[curDig];
  17.       title[curDig] = i;
  18.       count[curDig]++;
  19.     }
  20.     int bPos = size;
  21.     for (int i=9;i>=0;i--) {
  22.       while (count[i]) {
  23.         b[--bPos] = a[title[i]];
  24.         title[i] = prev[title[i]];
  25.         count[i]--;
  26.       }
  27.     }
  28.     osn *= 10; del *= 10;
  29.     swap(a,b);
  30.   }
  31.   delete[] b;
  32.   delete[] title;
  33.   delete[] count;
  34.   delete[] prev;
  35. }
* This source code was highlighted with Source Code Highlighter.

Вторая реализация обрабатывает цифру, состоящую из 8 байт. Т.е. исходное число обрабатывается в системе счисления с основанием 256 и содержит не более 4 цифр.

  1. void radix_sort256(UINT* &a, int size) {
  2.   UINT* b = new UINT[size];
  3.   UINT* title = new UINT[256];
  4.   UINT* count = new UINT[256];
  5.   UINT* prev = new UINT[size];
  6.   UINT mask[4] = {0x000000FF,
  7.         0x0000FF00,
  8.         0x00FF0000,
  9.         0xFF000000};
  10.  
  11.   memset(count,0,sizeof(UINT) * 256);
  12.   unsigned char curDig;
  13.   for (int r=0;r<1;r++) {
  14.     for (int i=0;i<size;i++) {
  15.       curDig = a[i] & mask[r];
  16.       prev[i] = title[curDig];
  17.       title[curDig] = i;
  18.       count[curDig]++;
  19.     }
  20.     int bPos = size;
  21.     for (int i=255;i>=0;i--) {
  22.       while (count[i]) {
  23.         b[--bPos] = a[title[i]];
  24.         title[i] = prev[title[i]];
  25.         count[i]--;
  26.       }
  27.     }
  28.     swap(a,b);
  29.   }
  30.   delete[] b;
  31.   delete[] title;
  32.   delete[] count;
  33.   delete[] prev;
  34. }
* This source code was highlighted with Source Code Highlighter.

воскресенье, 25 сентября 2011 г.

Сортировка подсчетом (Counting sort)

[Все сортировки]

Теория: Wikipedia

Практика
: acmp.ru

Реализация:

  1. void counting_sort(vector<int> &mas) {
  2.   vector<int> amount(MAX_VALUE,0);
  3.   for (int i=0;i<mas.size();i++)
  4.     amount[mas[i]]++;
  5.   int pos = -1;
  6.   for (int i=0;i<MAX_VALUE;i++)
  7.     for (int j=0;j<amount[i];j++)
  8.       mas[++pos] = i;
  9. }
* This source code was highlighted with Source Code Highlighter.

вторник, 20 сентября 2011 г.

Быстрая сортировка (Quick Sort) за O(NlogN) в среднем случае

[Все сортировки]

Теория: k-ая порядковая статистика 

Практика
: informatics.mccme.ru

Визуализатор: youtube.com [Adobe Flash Player]

Реализация:

  1. int partition(vector<int> &mas, int l, int r) {
  2.   int pos = l-1;
  3.   for (int i = l; i <= r; ++i) {
  4.     if (mas[i] <= mas[r] )
  5.       swap(mas[++pos], mas[i]);
  6.   }
  7.   return pos;
  8. }
  9. void quick_sort(vector<int> &mas, int l, int r) {
  10.   if (l >= r) return;
  11.   int pivot = partition(mas,l,r);
  12.   quick_sort(mas,l,pivot-1);
  13.   quick_sort(mas,pivot+1,r);
  14. }
* This source code was highlighted with Source Code Highlighter.

Данная реализация на предложенной задаче работает в 2 раза быстрее(0.059 c), чем heap_sort(0.122 c).

вторник, 1 февраля 2011 г.

Карманная сортировка (Bucket_sort)

[Все сортировки]

Теория: Wikipedia + Кормен[п.8.4. Второе издание]

Практика: informatics.mccme.ru

Реализация:

  1. const int MAX_VALUE = 2000; // значения массива [0, MAX_VALUE]
  2. const int BUCKETS = 10;     // количество карманов
  3. ...
  4. void bucket_sort(vector<int> &mas) {
  5.   vector<list<int> > mem(BUCKETS);
  6.   for (int i=0;i<mas.size();i++) {
  7.     int pos = (mas[i] - 1) / (MAX_VALUE / BUCKETS);
  8.     list<int>::iterator it = mem[pos].begin();
  9.     while (it != mem[pos].end() && *it < mas[i])
  10.       it++;
  11.     mem[pos].insert(it,mas[i]);
  12.   }
  13.   int pos = 0;
  14.   for (int i=0;i<BUCKETS;i++) {
  15.     for(list<int>::iterator it = mem[i].begin();it!= mem[i].end();it++)
  16.     {
  17.       mas[pos++] = *it;
  18.     }
  19.   }
  20. }
* This source code was highlighted with Source Code Highlighter.

воскресенье, 10 октября 2010 г.

Плавная сортировка (Smooth_sort)

[Все сортировки]

Предварительные темы:
1. Пирамидальная сортировка
2. Битовые операции

Теория: На русском языке мне, к сожалению, не удалось найти ни одного материала по этой теме. Поэтому общее представление об алгоритме можно получить из англоязычного источника, например здесь.
Рекомендую обратить внимание на gif’ку, представленную в статье. Лично мне она очень понравилась).


воскресенье, 19 сентября 2010 г.

Сортировка Шелла (Shell_sort)

[Все сортировки]

Теория: Общая информация изложена здесь

Практика
: informatics.mccme.ru

Визуализатор: rain.ifmo.ru  [Java]

Реализация:
Данная сортировка является модификацией сортировки вставками.

Сортировка с помощью бинарного дерева (Tree_sort)

[Все сортировки]

Теория: Общая информация изложена здесь

Практика
: informatics.mccme.ru

Реализация:

В своей реализации эта сортировка использует структуру данных: бинарное дерево, каждый элемент которого можно описать следующим образом:
  1. struct tree
  2. {
  3.   tree* left; // левый сын
  4.   tree* right; // правый сын
  5.   int value// значение
  6. };
* 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

Реализация:
  1. void gnome_sort(vector<int> &mas)
  2. {
  3.   int cur = 0;
  4.   while (cur + 1 < mas.size())
  5.   {
  6.     if (mas[cur]<=mas[cur+1])
  7.       cur++;
  8.     else
  9.     {
  10.       swap(mas[cur],mas[cur+1]);
  11.       cur--;
  12.       if (cur<0) cur = 0;
  13.     }
  14.   }
  15. }
* This source code was highlighted with Source Code Highlighter.

Сортировка выбором(Selection_sort)

[Все сортировки]

Теория: Общая информация изложена здесь

Практика
: informatics.mccme.ru

Визуализатор: rain.ifmo.ru  [Java]

Реализация
:
  1. void selection_sort(vector<int> &mas)
  2. {
  3.   for (int i=0;i<mas.size();i++)
  4.     for (int j=i+1;j<mas.size();j++)
  5.       if (mas[i]>mas[j])
  6.         swap(mas[i],mas[j]);
  7. }
* This source code was highlighted with Source Code Highlighter.

UPD[29.09.2011]

  1. void selection_sort(vector<int> &mas) {
  2.   for(int i=0;i<mas.size();i++) {
  3.     int minPos = i;
  4.     for(int j=i+1;j<mas.size();j++)
  5.       if(mas[minPos] > mas[j])
  6.         minPos = j;
  7.     swap(mas[minPos],mas[i]);
  8.   }
  9. }
* 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]

Реализация:
  1. void insert_sort(vector<int> &mas) {
  2.   for (int i=1;i<n;++i) {
  3.     for (int j=i;j>0;j--) {
  4.       if (mas[j-1] > mas[j])
  5.         swap(mas[j-1],mas[j]);
  6.       else
  7.         break;
  8.     }
  9.   }
  10. }
* This source code was highlighted with Source Code Highlighter.

Шейкерная сортировка (Cocktail_sort)

[Все сортировки]

Теория: Общая информация изложена здесь

Практика
: informatics.mccme.ru

Реализация:
  1. void cocktail_sort(vector<int> &mas)
  2. {
  3.   int l = 0, r = mas.size()-1;
  4.   while (l<=r)
  5.   {
  6.     // всплывает самый "легкий" элемент
  7.     for (int i = r ;i>l;i--)
  8.       if (mas[i-1]>mas[i])
  9.         swap(mas[i-1],mas[i]);
  10.     l++;
  11.     // тонет самый "тяжелый элемент"
  12.     for (int i=l; i<r; i++)
  13.       if (mas[i]>mas[i+1])
  14.         swap(mas[i],mas[i+1]);
  15.     r--;
  16.   }
  17. }
* This source code was highlighted with Source Code Highlighter.

суббота, 11 сентября 2010 г.

Пузырьковая сортировка (Bubble_sort)

[Все сортировки]

Теория: Общая информация изложена здесь

Практика
: informatics.mccme.ru

Визуализатор: rain.ifmo.ru  [Java]

Реализация
:
  1. void bubble_sort(vector<int> &mas)
  2. {
  3.   for (int i=1;i<mas.size();i++)
  4.     for (int j = mas.size()-1;j>=i;j--)
  5.       if (mas[j-1]>mas[j])
  6.         swap(mas[j-1],mas[j]);
  7. }
* This source code was highlighted with Source Code Highlighter.

воскресенье, 5 сентября 2010 г.

Сортировки


Квадратичные сортировки 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)      -




* Плюсом отмечены стабильные сортировки

Пирамидальная сортировка (Heap Sort)

[Все сортировки]

Теория: читаем дивную статью с картинками

Практика
: informatics.mccme.ru

Визуализатор: rain.ifmo.ru [Java]