Влияние върху производителността


# include # include # include # include “Item.h”



страница19/43
Дата21.12.2022
Размер1.47 Mb.
#116011
1   ...   15   16   17   18   19   20   21   22   ...   43
CAA.doc
Свързани:
saap conspect

# include # include # include # include “Item.h”


static char buf [100000]; static int cnt = 0;

int ITEM scan (char **x)


{ int t;

*x = & buf [cnt];


t = scanf (“%s”, *x); cnt+ = strlen (*x) return t; }

void ITEMshow (char *x)


{ printf (“%s”, x); }

1 прост подход за сорт.без мест.на елем.е да поддържаме индексен масив с ключове-те в елем.,достъпни само за сравн.Нека сорт.елем. са в масива data[0],…,data[N-1] и не искаме да ги местим.За да постигнем ефекта на сорт.,използ.втори масив а от индексите на елем.Започ.с иниц.на a[i]=i, за i=0,…,N-1.Целта на сорт.е да пренаредим индекс.масив а,така че а[0] да дава индекса на елем.данни с най-малък ключ,и т.н.Така манипулираме индексите вместо записите.
Др.възмож.е да използ.указатели,т.е.реализ указателна сорт.За сорт.на масив от елем. указ.сорт.е ⬄на индексната но с адресите на масива,добавени към вс.индекс.Указ. сорт обаче е по-обща,защото указ.мд сочат навсякъде,а сорт.елем.не е необх.да са фик-сирани по размер.Ако а е масив от указ. към ключове,тогава викането на сорт.ф-я ще доведе до това,че указ.ще се пренаредят така че ако се обръщаме към тях последов., ще достигнем до ключовете в сорт.ред. Ре-ализ.сравн.като следваме указ.,а размените релиз.чрез размяна на указ.
Глав.причина да използ.индекси или указ. е да избегнем вмешателство в сорт.данни. Мд сорт.файл даже ако всичко което имаме е достъп до него само за четене.Даже с ня-колко масива от индекси или указ.мд сорт. 1 файл по няколко ключа.


  1. Пирамидална сортировка.Базирани на пирамида алгоритми.Конвертиране в пирамида.Сортиране в пирамида.


Един метод който усъвършенства метода на пряката селекция е метода на пирамидалното сортиране. За да говорим обаче за този метод е нужно да построим структура от данни , която да позволява избирането на най-малкия елемент със сложност О(logn) а не с O(n). Тогава общото време на бързодействието ще е n*O(n*logn) = O(n*logn).
Тази структура също така трябва да позволява бързо да се вкарват нови елементи (за да може да се построи бързо от изходния масив) и да се премахва максималния елемент(той ще се помества във вече сортираната част на масива – неговия десен край).
И така пирамида (Heap) се нарича бинарно дърво с височина k, в което:

  • Всички възли имат дълбочина k или k-1

  • При това ниво k-1 е напълно заето, а ниво k е запълнено частично от ляво надясно

  • Изпълнено е свойството на пирамидата: всеки елемент е по-малък или равен на родителя си

Построяването на пирамидата може да започне от a[k]...a[n], k = [size/2]. Тази част на масива удовлетворява свойството на пирамидата, тъй като не съществуват индекси i,j: i = 2i+1 ( или j = 2i+2 ). Просто заради това че тези индекси са извън границата на масива.
Следва да се отбележи че е неправилно да се казва че a[k]..a[n] се явява пирамида ако се разглежда самостоятелно. Това, говорейки конкретно, не е вярно: елементтите му могат да са произволни. Свойството на пирамидата се съхранява само в границите на изходния масив a[0]...a[n].
По нататък ще разширяваме част от масива, която има това полезно свойство, като добавяме един елемент на всяка стъпка. Този елемент ще е онзи който предхожда готовата част.

За да може при добавяне да се съхрани пирамидалната структура ще използваме следната процедура за разширяване на пирамидата
a[i+1]..a[n] с елемент a[i] наляво:

    1. Гледаме кои са синовете (в масива това са a[2i+1] и a[2i+2]) и избираме по-големия от тях

    2. Ако избраният е по-голям от a[i] – сменяме го с a[i] и отиваме на стъпка 2 като имаме предвид новото положение на a[i]. В противен случай слагаме край на процедурата.

Казвме че новия елемент се пресява през пирамидата: Строенето на пирамидата става със следния код :


Сподели с приятели:
1   ...   15   16   17   18   19   20   21   22   ...   43




©obuch.info 2024
отнасят до администрацията

    Начална страница