Кіріспе

Салыстыруға негізделген сұрыптау алгоритмі
Компьютерлік ғылымда адаптивті үйірме сұрыптау – адаптивті сұрыптау отбасының салыстыруға негізделген сұрыптау алгоритмі. Бұл деректерде қазіргі тартіп болған кезде жақсы жұмыс істейтін үйірме сұрыптаудың түрі. 1992 жылы Христос Левкопулос пен Ола Петерсон жариялаған алгоритм тербелістер саны ретінде алдын ала сұрыпталудың жаңа өлшемін, Osc, пайдаланады. Дәстүрлі үйірме сұрыптау сияқты барлық деректерді үйірмеге орналастырудың орнына, адаптивті үйірме сұрыптау деректердің бір бөлігін ғана үйірмеге алады, сондықтан деректердің алдын ала сұрыпталуы жоғары болған кезде орындалу уақыты айтарлықтай қысқарады. Бұл келесі төрт қадамды қамтиды. Макс үйірме (Минимальды үйірме) құру: барлық деректерді үйірмеге орналастырыңыз, сондықтан барлық түйіндер оның әрбір дочер түйінінен үлкен немесе тең (Минимальды үйірме үшін кіші немесе тең) болады. Үйірменің бірінші элементін үйірменің соңғы элементімен ауыстырыңыз. Соңғы элементті тізімнен алып тастап, оны тізімнің соңына қойыңыз. Үйірмені бірінші элемент дұрыс орынға орналасуы үшін түзетіңіз. 2- және 3-қадамды үйірмеде бір ғана элемент қалғанша қайталаңыз. Соңғы элементті тізімнің соңына қойып, тізімді шығарыңыз. Тізімдегі деректер сұрыпталады. Төменде Макс үйірмені құратын және үйірме құрылғаннан кейін массивті сұрыптайтын C/C++ іске асырылуы келтірілген. /*
Массивті өсу ретімен сұрыптайтын C/C++ үлгілік үйірме сұрыптау коды
*/

// Макс үйірме екілік ағашын құратын функция
void heapify(int array[], int start, int end)
{
int parent = start;
int child = parent * 2 + 1;
while (child <= end)
{
if (child + 1 <= end) // екі дочер түйіні болған кезде
{
if (array[child + 1] > array[child])
{
child++; // үлкен дочер түйінін таңдау
}
}
if (array[parent] > array[child])
{
return; // егер ата-ана түйіні үлкен болса, онда ол қазірдің өзінде үйірмеленген
}
if (array[parent] < array[child]) // егер дочер түйіні ата-ана түйінінен үлкен болса
{
std::swap(array[parent], array[child]); // ата-ана мен дочер түйінін ауыстыру
parent = child;
child = child * 2 + 1; // циклды жалғастыру, дочер түйіні мен оның дочер түйіндерін салыстыру
}
}
}

// үйірме сұрыптау функциясы
void heapSort(int array[], int len)
{
for (int i = len / 2 - 1; i >= 0; i--) // 1-қадам: Макс үйірмені құру
{
heapify(array, i, len);
}
for (int i = len - 1; i >= 0; i--) // 4-қадам: 2- және 3-қадамды аяқталғанша қайталау
{
std::swap(array[0], array[i]); // 2-қадам: Макс элементті массив соңына орналастыру
heapify(array, 0, i); // 3-қадам: ағаштан Макс элементті алып тастап, қайтадан үйірмелеу
}
}

int main()
{
// сұрыпталатын массив
int array[] = {42, 1283, 123, 654, 239847, 45, 97, 85, 763, 90, 770, 616, 328, 1444, 911, 315, 38, 5040, 1};
int arrayLen = sizeof(array) / sizeof(*array); // массив ұзындығы

heapSort(array, arrayLen);

return 0;
}

Алдын ала сұрыпталудың өлшемдері

Алдын ала реттелгендік өлшемдері берілген тізбектегі қолданыстағы реттілікті бағалайды. Бұл алдын ала реттелгендік өлшемдері сұрыптау процесінде жиынға (heap) қосылатын деректер мөлшерін, сондай-ақ орындалу уақытының ең төменгі шегін анықтайды.

Кемшіліктері

Онжылдық зерттеулерге қарамастан, адаптивті үйме сұрыптау теориясы мен оның практикалық қолданылуы арасында әлі де айырмашылық бар. Алгоритм Картезиандық ағаштарды және көрсеткіштермен жұмыс істеуді қолданғандықтан, оның кэш пайдалану тиімділігі төмен және жадқа қажеттігі жоғары, бұл орындалу жылдамдығын нашарлатады.