- •Методы построения хэш-функций
- •Адресация в хэш-таблицах
- •Открытая адресация
- •Способы вычисления последовательности испробованных мест при открытой адресации
- •Реализация хэш-таблицы с открытой адресацией
- •Int HashFn(int key, int m, int p)
- •Int Next_hash(int hash, int m, int p)
- •Int HashOt::SearchInd(int key)
- •Прямая адресация
- •Реализация хэш-таблиц с прямой адресацией
- •Void* Data;
- •Int _tmain(int argc, _tchar* argv[])
- •Исследование времени
- •Оценка сложности алгоритмов
- •Анализ трудоёмкости алгоритмов
- •Классы сложности
- •Поиск и сортировка
- •Int Is_sorted(int a[ ], int n)
- •Void main()
- •Int BinP(int c[], int n, int val)
- •Void main()
- •Сортировка
- •Обменные сортировки
- •Void BubbleSort(int *a, int n)
- •Void main()
- •Void BubbleSort(int *a, int n)
- •Void main()
- •Шейкерная сортировка (перемешиванием)
- •Void ShakerSort(int *b, int Start, int n)
- •Void main()
- •Void BubbleSort(int *a, int n)
- •Void ShakerSort(int *b, int Start, int n)
- •Void main()
- •Сортировка выбором
- •Void SelectSort(int a[], int n)
- •Void main()
- •Сортировка квадратичной выборкой
- •Сортировка вставками
- •Void main()
- •InsertSort(a, n);
- •Cортировка Шелла
- •Void main()
- •Сортировка разделением (быстрая сортировка)
- •Void QuickSort(int a[], int n)
- •Void main()
- •Int GetHoarBorder(int m[], int sm, int em)
- •Int* SortHoar(int m[], int sm, int em)
- •Void main()
- •Сортировка подсчетом
- •Void CountSort(int in[], int out[], int n)
- •Void main()
- •Пирамидальная сортировка
- •Void Heapify (int a[], int pos, int n)
- •Void PiramSort(int a[], int n)
- •Void main()
- •Void iswap(int &n1, int &n2)
- •Int main()
- •Сортировка слиянием
- •Void InsOrd(int m[], int sm, int em, int e)
- •Void main()
- •Поразрядная (распределяющая) сортировка
- •Int VelichRazr(int chislo, int razr)
- •Void PorazrSort(int b[n][n], int a[n], int razr)
- •Void main()
- •Методы разработки алгоритмов
- •Свойства алгоритма
- •Метод декомпозиции (разбиения)
- •Динамическое программирование
- •Жадные алгоритмы
- •Полный перебор
- •Алгоритмы локального поиска
- •Методы и технологии разработки программ
Void Heapify (int a[], int pos, int n)
{ int t, tm;
while (2*pos + 1 < n)
{ t = 2*pos +1;
if (2*pos+2<n && A[2*pos+2] >= A[t])
t = 2*pos + 2;
if (A[pos] < A[t])
{ tm = A[pos]; A[pos] = A[t];
A[t] = tm; pos = t;
}
else break;
}
}
Void PiramSort(int a[], int n)
{ int tm;
for (int i = n - 1; i >= 0; i--)
Heapify(A, i, n);
while(n>0)
{ tm = A[0]; A[0] = A[n-1];
A[n-1] = tm; n--;
Heapify(A, 0, n);
}
}
Void main()
{ int n; int A[100];
cout<<"Razmer "; cin>>n;
for(int i = 0; i < n; i++)
{ cout<<"Number= "; cin>> A[i]; }
PiramSort(A, n);
for(int i = 0; i < n; i ++)
cout << A[i]<<' ';
}
Преимущество алгоритма в том, что пирамида хранится прямо в исходном массиве. По мере того, как размер пирамиды уменьшается, она занимает всё меньшую часть массива, а результат сортировки записывается, начиная с конца массива на освободившиеся от пирамиды места.
Пирамидальная сортировка проигрывает быстрой сортировке по эффективности для больших массивов (в 1,5 раза медленнее).
Среднее число пересылок - (n*logn)/2
Трудоемкость O(nlog(n)).
Другая программа
#include <iostream>
#include <conio.h>
using namespace std;
Void iswap(int &n1, int &n2)
{ int temp = n1; n1 = n2; n2 = temp;}
Int main()
{ int const n = 100; int a[n];
for ( int i = 0; i < n; ++i ) { a[i] = n - i; cout << a[i] << " "; }
bool b = false; int sh = 0; //смещение
for(;;)
{ b = false; for ( int i = 0; i < n; i++ )
{ if( i * 2 + 2 + sh < n )
{ if((a[i+sh]> a[i*2+1+sh]) || (a[i+sh]>a[i * 2 + 2 + sh]))
{ if ( a[i * 2 + 1 + sh] < a[i * 2 + 2 + sh] )
{ iswap( a[i + sh], a[i * 2 + 1 + sh] ); b = true; }
Else if ( a[i * 2 + 2 + sh] < a[ i * 2 + 1 + sh])
{ iswap( a[ i + sh], a[i * 2 + 2 + sh]); b = true; }
}
//дополнительная проверка для последних двух элементов
//с помощью этой проверки можно отсортировать пирамиду
//состоящую всего лишь из трех элементов
if( a[i*2 + 2 + sh] < a[i*2 + 1 + sh] )
{ iswap( a[i*2+1+sh], a[i * 2 +2+ sh] ); b = true; }
}
else if( i * 2 + 1 + sh < n )
{ if( a[i + sh] > a[ i * 2 + 1 + sh] )
{ iswap( a[i + sh], a[i * 2 + 1 + sh] ); b = true; } }
}
if (!b) sh++; //смещение увелич. когда на тек. этапе сортировать нечего
if ( sh + 2 == n ) break; } //конец сортировки
cout << endl << endl;
for ( int i = 0; i < n; ++i ) cout << a[i] << " ";
return 0; }
Сортировка слиянием
Сортировка слиянием предполагает последовательный доступ к элементам сортируемых последовательностей.
Алгоритм является рекурсивным.
Если из упорядоченных последовательностей брать по одному очередному элементу, выбирать из них минимальный и переносить его в результирующую последовательность, то выходная последовательность будет упорядоченной.
Отсюда возможен простой способ однократного слияния: массив разбивается на n частей, каждая из них сортируется независимо, а затем отсортированные части объединяются слиянием.
Пусть исходный массив делится на две части.
#include <iostream>
using namespace std;