Сұрыптау алгоритмдерінің түрлері және бейнеленуі. Мысал келтіріңіз
Сұрыптау - берілген обьектілер жиынын ұсынылған реттілікпен қайта теріп орналастыру процесі. Сұрыптаудың мақсаты – сұрыпталған тізбекте қажетті элементтерді іздестіруді жеңілдету. Сұрыптау алгоритмдері мәліметтер құрылымын таңдауға тәуелді, сондықтан сұрыптау әдістерін екі түрге бөледі: ішкі сұрыптау алгоритмдері(массивтерді сұрыптау) және сыртқы сұрыптау алгоритмдері(файлдарды сұрыптау).
Ішкі сұрыптаулар алгоритмдері – бұл ішкі жадтағы мәліметтерді сұрыптау алгоритмдері, бұл жағдайда қолайлы құрылым – массив. Қарапайым сұрыптау алгоритмдері: кірулермен сұрыптау, таңдаумен сұрыптау, алмасумен сұрыптау («көбікше» әдісі). Сұрыптаудың жетілдірілген қарапайым әдістері: кемімелі өсімшелі кіру бойынша сұрыптау (Шелл сұрыптауы), ағаш көмегімен сұрыптау (пирамидалық сұрыптау), бөліктеу арқылы сұрыптау (жылдам сұрыптау).
Кірулермен сұрыптау – элементтер шартты түрде дайын тізбекке a1,…, ai-1 және кіретін тізбекке ai,…, an бөлінеді, содан кейін әрбір қадамда, i=2 бастап және i-ді бірлікке арттыра отырып, кіретін тізбектің i-ші элементін алып дайын тізбектің тиісті орнына кіргізе береді.
Керекті орынды іздеу кезінде оң жақтағы келесі элементпен орын ауыстыру қарастырылады, яғни таңдалып алынған элемент сұрыпталғандардың J=I-1 нөмірінен басталатын кезекті элементімен салыстырылады. Егер таңдалып алынған элемент a[I]-ден артық болса, онда ол сұрыпталғандар ішіне қосылады, әйтпесе a[J] бір орынға ығысады да, таңдалған элемент сұрыпталғандар ішіндегі келесі элементпен салыстырылады. Керекті орынды іздеу әрекеті екі жағдайда:
- Егер a[I]> a[J] болатын элемент табылса;
- Дайын тізбектің сол жақ шетіне жеткен кезде аяқталады.
Мысалы:
int i,j,x;
For(i=1;i<n;i++)
{x=a[i]; //ауысатын элементті есте сақтау
J=i-1;
While(x<a[j]&&j>=0) // керекті орынды іздеу
{a[j+1]=a[j]; // оңға жылжыту
j--; }
A[j+1]=x; //элементті кірістіріп қою }
Таңдаумен сұрыптау – ең кіші элемент таңдалады, содан кейін ол бірінші a1 элементімен орын ауыстырылады. Қалған элементтермен де осы тәсіл қайталанады.
int I, min, n_min,j; for(int i=0;i<n-1;i++)
{ min=a[i]; n_min=i; //минимумды іздеу
for(j=i+1;j<n; j++) if(a[j]< min)
{ min=a[j]; n_min=j; }
a[n_min]=a[i]; /алмастыру a[i]=min; }
Алмасумен сұрыптау – барлық элементтер қажетінше сұрыпталғанша көрші элементтер өзара салыстырылып және орын ауыстырылады. Осындай әрекет нәтижесінде ең кіші элемент жиымның ең сол жақ шетіне ығысады.
For(int i=1;i<n;i++) For(int j=n-1;j>=I;j--) If(a[j]<a[j-1])
{int r=a[j]; a[j]=a[j-1];a[j-1]=r;}
Жиымдарды сұрыптау жылдамдығы әр түрлі болады. Қарапайым сұрыптау тәсілдері n*n рет салыстыруды керек етеді, мұндағы n- жиым элементтері саны; ал жылдам сұрыптау тәсілі n*ln(n) рет салыстыруды қажет етеді. Қарапайым тәсілдер түсінуге жеңіл, өйткені алгоритмі түсінікті. Күрделі тәсілдер аз әрекеттер санын керек еткенмен, операциялары күрделірек болады, сондықтан элементтер саны аз жиымдарға қарапайым тәсілдерді қолданған дұрыс.
Сыртқы сұрыптау алгоритмдері – бұл сыртқы жадтағы мәліметтерді сұрыптау алгоритмдері, мұнда қолайлы құрылым - файл. Негізгі ерекшелігі - өңдеудің әрбір уақыт мезетінде тек бір ғана элементі жетімді. Файлдарды сұрыптау әдістерінің көпшілігі тоғыстыру процедурасына негізделеді. Тоғыстыру – екі (немесе одан да көп) тізбектерді бір тізбекке біріктіру, ол тізбек элементтері қайталанатын таңдау арқылы реттелген. Қарапайым тоғыстыру келесі қадамдардан тұрады:
1. a тізбегі b және c екі жартыға бөлінеді;
2. b және c тізбектері жеке элементтерді реттелген жұптарға біріктіру арқылы тоғыстырылады;
3. Алынған тізбек a деп аталады, содан кейін 1 және 2 қадамдар қайталанады; бұл жолы реттелген жұптар реттелген төрттіктерге тоғыстырылады;
4. Алдыңғы қадамдар қайталады; төрттіктер сегіздіктерге тоғыстырылады, барлық үрдіс бүкіл тізбек реттелгенше жалғасады; тоғыстырылатын жарты тізбектер ұзындықтары екі еселеніп отырады.
Табиғи тоғыстыру – бұл әр тоғыстыруда мүмкін ең ұзын ішкі тізбектер біріктірілетін тоғыстыру.