Реферат Курсовая Конспект
Сортировка, пирамидальная сортировка. Параметры задачи: размер последовательности, длина строки. Мера сравнения: число обменов, число сравнений, Время выполнения. - раздел Образование, Упорядочивание Строковой (Char*) Последовательности. Ал...
|
Упорядочивание строковой (char*) последовательности. Алгоритмы: шейкерная
Сортировка, пирамидальная сортировка. Параметры задачи: размер
последовательности, длина строки. Мера сравнения: число обменов, число сравнений,
Время выполнения.
Пример
def heapsort(s):
sl = len(s)
def swap(pi, ci):
if s[pi] < s[ci]:
s[pi], s[ci] = s[ci], s[pi]
def sift(pi, unsorted):
I_gt = lambda a, b: a if s[a] > s[b] else b
while pi*2+1 < unsorted:
Gtci = i_gt(pi*2+1, pi*2+2) if pi*2+2 < unsorted else pi*2+1
swap(pi, gtci)
Pi = gtci
Heapify
for i in range((sl/2)-1, -1, -1):
sift(i, sl)
Sort
for i in range(sl-1, 0, -1):
swap(i, 0)
sift(0, i)
static void HeapSort(int[] a)
{
int i;
int temp;
for (i = (a.Length / 2) - 1; i >= 0; i--)
{
siftDown(a, i, a.Length);
}
for (i = a.Length - 1; i >= 1; i--)
{
temp = a[0];
a[0] = a[i];
a[i] = temp;
siftDown(a, 0, i - 1);
}
}
static void siftDown(int[] a, int i, int j)
{
bool done = false;
int maxChild;
int temp;
while ((i * 2 < j) && (!done))
{
if (i * 2 == j)
maxChild = i * 2;
else if (a[i * 2] > a[i * 2 + 1])
maxChild = i * 2;
Else
maxChild = i * 2 + 1;
if (a[i] < a[maxChild])
{
temp = a[i];
a[i] = a[maxChild];
a[maxChild] = temp;
i = maxChild;
}
Else
{
done = true;
}
}
}
Идея алгоритма
Для того, чтобы прояснить всё дальнейшее изложение, в двух словах опишу идею алгоритма.
Пирамида — двоичное дерево, в котором значение каждого элемента больше либо равно значений дочерних элементов.
Заполнив дерево элементами в произвольном порядке, можно легко его отсортировать (легче, чем исходный список элементов), превратив в пирамиду.
Самый большой элемент пирамиды находится в её вершине.
Отделяем вершинный элемент, и записываем его в конец результирующего массива.
На место вершинного элемента записываем элемент из самого нижнего уровня дерева.
Восстанавливаем (пересортировываем) пирамиду.
Самый большой элемент из оставшихся снова в вершине. Снова отделяем его и записываем его в качестве предпоследнего элемента результата, и так далее...
Весь фокус алгоритма в том, что пирамида без дополнительных затрат хранится прямо в исходном массиве. По мере того, как размер пирамиды уменьшается, она занимает всё меньшую часть массива, а результат сортировки записывается начиная с конца массива на освободившиеся от пирамиды места.
Ещё одно объяснение идеи алгоритма можете посмотреть в этом комментарии.
Двоичное дерево
Двоичное дерево — структура данных, в которой каждый элемент имеет левого и/или правого потомка, либо вообще не имеет потомков. В последнем случае элемент называется листовым.
Если элемент A имеет потомка B, то элемент A называется родителем элемента B. В двоичном дереве существует единственный элемент, который не имеет родителей; такой элемент называется корневым.
Pragma hdrstop
Pragma argsused
Шейкер-сортировка
int main(int argc, TCHAR* argv[])
{
const int Count = 10;
int TestArr[Count] = {3, 1, 5, 8, 1, 0, 6, 4, 6, 7};
ShakerSort(TestArr,1,Count);
ArrayOutput(TestArr,0,Count);
return 0;
}
Поменять местами i-й и i-1-й элементы массива Arr
void Swap(int Arr[], int i)
{
Int temp; //буфер
temp = Arr[i];
Arr[i] = Arr[i - 1];
Arr[i - 1] = temp;
}
void ShakerSort(int Arr[], int Start, int N)
{
Int Left, Right; //границы сортировки
Left = Start;
Right = N - 1;
Do
{
//Сдвигаем к началу массива "легкие элементы"
for (int i = Right; i >= Left; i--)
{
if (Arr[i - 1]>Arr[i])
{
Swap(Arr, i);
}
}
Left = Left + 1;
//Сдвигаем к концу массива "тяжелые элементы"
for (int i = Left; i <= Right; i++)
{
if (Arr[i - 1] > Arr[i])
{
Swap(Arr, i);
}
}
Right = Right - 1;
}
while (Left <= Right);
}
– Конец работы –
Используемые теги: Сортировка, пирамидальная, Сортировка, параметры, задачи, размер, последовательности, Длина, строки, мера, Сравнения, Число, обменов, Число, сравнений, время, выполнения0.18
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Сортировка, пирамидальная сортировка. Параметры задачи: размер последовательности, длина строки. Мера сравнения: число обменов, число сравнений, Время выполнения.
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов