9.эрэмбэлэлтийн аргууд

41
Эрэмбэлэлтийн энгийн аргууд Өгөгдлийн бүтэц лекц 9

Transcript of 9.эрэмбэлэлтийн аргууд

Page 1: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн энгийн аргууд

Өгөгдлийн бүтэц лекц 9

Page 2: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд

Програмын тооцоолох ажилд нөлөөлөх нэг үндсэн

үйлдэл бол эрэмбэлэлт юм.

Объектуудын өгөгдсөн олонлогийг өгөгдсөн шинж

чанараар нь эрэмбэлэх процессыг эрэмбэлэлт гэнэ.

Эрэмбэлэлт нь өгөгдлүүдийг тодорхой дарааллаар

тухайлбал, өсөхөөр эсвэл буурахаар зохион байгуулах

үйлдэл юм.

Page 3: 9.эрэмбэлэлтийн аргууд

Агуулга Эрэмбэлэлтийн тухай

Сонгон эрэмбэлэх арга

Оруулан эрэмбэлэх арга

Бөмбөлгөн эрэмбэлэх арга

Байрыг нь солин эрэмбэлэх арга

Page 4: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд

Эрэмблэх өгөгдөл нь хэд хэдэн талбаруудаас тогтох

бичлэг байж болох ба энэ тохиолдолд эрэмблэлтийг

аль нэг талбарын утгаар хийдэг. Энэ талбарыг түлхүүр гэж нэрэлдэг.

Хэрэв эрэмблэх нийт өгөгдөл нь санах ойд

хүрэлцэхүүц бага хэмжээтэй бол дотоод эрэмблэлт

гэнэ.

Хэрэв өгөгдлийн хэмжээ нь дотоод эрэмблэлтээр

хйигдхээргүй их хэмжээтэй бол гадаад эрэмблэлт

гэнэ. Өөрөөр хэлбэл гадаад эрэмблэлтийг дискэн

дээр хийдэг.

Page 5: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд

Массивын элемент болох өгөгдлүүдийг дараах

байдлаар эрэмбэлж болно

Page 6: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд

Эрэмбэлэгдсэн өгөгдөл хайлтыг хурдасгах ач

холбогдолтой.

Хэрэв өгөгдөл нь эрэмбэлэгдээгүй бол бид хүссэн

өгөгдлөө авахын тулд өгөгдлийн эхнээс нь дараалан

хайхаас өөр аргагүй.

Page 7: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд

Эрэмбэлэх өгөгдлийн тоо болон програмын

зорилгоос хамааран эрэмбэлэлтийн олон ялгаатай

аргуудаас тохирохыг нь сонгож хэрэглэх хэрэгтэй.

Эрэмбэлэлтийн аргуудыг харьцуулах гол хэмжүүр

бол тэдгээрийн ажиллах хугацаа юм.

Эрэмбэлэлтийн алгоримтуудын түлхүүр үйлдэл нь:

Харьцуулах үйлдэл

Утга солилцох үйлдэл гэсэн хоѐр үйлдлээр

тодорхойлогддог

Page 8: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд

Гэвч эрэмбэлэлтийн алгоритмуудын хувьд харьцуулалтын тоо нь илүү чухал байдаг.

Эрэмбэлэлтийн алгоримтын өөр нэг хэмжүүр бол

шаардагдах нэмэлт санах ой юм. Зарим алгоритм нэмэлт зай ашигладаггүй байхад зарим нь N

өгөгдлийг давхар хадгалах нэмэлт зайг шаарддаг.

Page 9: 9.эрэмбэлэлтийн аргууд

Эрэмбэлэлтийн аргууд Энд массивын 2 элемент солилцох swap() функцыг

тодорхойлъѐ:

void swap(Type a[], int i, int j){

Type temp=a[i];

a[i]=a[j];

a[j]=temp;

}

Page 10: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection

Sort

Аргын үндсэн санаа:

1. Элемэнтийн олонлогоос хамгийн бага/их элементийг сонгон олно.

2. Массивын хамгийн эхний/хамгийн их элементтэй хамгийн бага элементийн байрыг нь солино. Үүний дараа массивын хамгийн бага/хамгийн их элемент нь жинхэнэ эзлэх ѐстой байраа эзэлнэ.

3. Үлдсэн (N-1) ширхэг элементийн хувьд (1)-(2) алхмыг давтан гүйцэтгэн өөрийнхөө байх ѐстой байрыг эзлээгүй нэг ч элемент үлдэхгүй болтол нь үргэлжлүүлнэ

Page 11: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection

Sort

Нийтдээ дээрх (1)-(2) алхмыг (n-1) удаа давтан гүйцэтгэх ба эрэмбэлэлтийн процессын явцад

массивын эрэмбэлэгдсэн хэсэг нь өргөсөж

эрэмбэлэгдээгүй хэсэг нь багасах юм.

Энэ арга нь үлдэж байгаа хэсэг бүрээс хамгийн

бага/хамгийн их элемэнтийг сонгож байгаа учир

сонгон эрэмбэлэлтийн арга гэж нэрлэсэн

Page 12: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection Sort

Page 13: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection Sort

Page 14: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection Sort

Page 15: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection Sort

Page 16: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга – Selection Sort

void SelectionSort(Type a[], int n)

{ int i,j,min;

for(i=0;i<n-1;i++) {

min=i;

for (j=i+1;j<n;j++)

if (a[j]<a[min]) min=j;

swap(a,i,min);

}

}

Page 17: 9.эрэмбэлэлтийн аргууд

Жишээ

0 1 2 3 4 5 6 7 8 9

утга 3 0 1 8 7 2 5 4 9 6

Page 18: 9.эрэмбэлэлтийн аргууд

Оруулан эрэмбэлэх арга

Оруулан эрэмблэх алгоритм нь сонгон эрэмблэх алгоритмаас магадгүй илүү уян хатан шинж

чанартай.

Энэ аргын үндсэн үйлдэл нь эрэмбэлэгдсэн

олонлогт эрэмбийг нь алдагдуулахгүйгээр шинэ

элемэнт оруулах үйлдлээр тодорхойлогддог.

Өөрөөр хэлбэл эрэмбэлэгдсэн элемэнтүүдийн

шинэ элемэнтээс их элемэнтүүдийг нэг байрлал

баруун тийш шилжүүлэх байдлаар орвол зохих

байрлалыг чөлөөлж өгдөг

Page 19: 9.эрэмбэлэлтийн аргууд

Оруулан эрэмбэлэх арга

Page 20: 9.эрэмбэлэлтийн аргууд

Оруулан эрэмбэлэх арга

Page 21: 9.эрэмбэлэлтийн аргууд

Оруулан эрэмбэлэх арга

Шинээр оруулах элемэнтийг массивын 2 дахь

элемэнтээс эхлэн авна.

Эхний алхамд хамгийн эхний элемэнтийг эрэмбэлэгдсэн массив гэж үзэн 2 дахь элемэнтийг эхний элемэнттэй

харьцуулан байрлалыг нь олсноор 2 элемэнттэй

эрэмбэлэгдсэн массив гарган авна.

Удаах алхамд үүссэн 2 элемэнт бүхий эрэмбэлэгдсэн

массивтаа массивын 3 дахь элемэнтийг оруулах байдлаар массивын төгсгөл хүртэл бүх элемэнтийн хувьд

давтан гүйцэтгэнэ.

Page 22: 9.эрэмбэлэлтийн аргууд

InsertionSort функц:

void InsertionSort(Type a[], int n){

int i,j;

Type elem;

for(i=1; i<n; i++){

elem=a[i]; j=i-1;

while(j>=0 && elem<a[j])

{ a[j+1]=a[j];

j=j-1;

} a[j+1]=elem;

}

}

Page 23: 9.эрэмбэлэлтийн аргууд

Сонгон эрэмбэлэх арга

Оруулан эрэмбэлэх арга

Page 24: 9.эрэмбэлэлтийн аргууд

Бөмбөлгөн эрэмбэлэлтийн арга

Энэ аргын мөн чанар нь олонлогийн элемэнтүүдийг

эхнээс нь эцэс хүртэл хос хосоор нь сонгон авч

буруу байрлалтай буюу өөрөөр хэлбэл i< j үед

a[i]>a[j] байх тийм хос элемэнтүүдийн байрыг солих

явдал юм

Page 25: 9.эрэмбэлэлтийн аргууд

Бөмбөлгөн эрэмбэлэлтийн арга

Элемэнтүүдийг хос хосоор нь сонгон авч буруу

байрлалтай бол тэдгээрийн байрыг солино тийм биш бол өөрчлөхгүй хэвээр нь үлдээх гэх мэтээр

цааш үргэлжлүүлнэ.

Үр дүнд нь хамгийн их утгатай элемэнт массивын

төгсгөлд байрлана.

Ийнхүү хамгийн их утгатай элемэнт нь өөрийнхөө

байрлалыг эзлэх тул түүнээс бусад элемэнтүүдээс

тогтох массивын хэсгийг авч түүн дээр өмнөх

үйлдлүүдийг давтан гүйцэтгэх процессыг авч үлдэж

буй хэсэг дэхь элемэнтийн тоо 2-оос багасахгүй

болтол нь үргэлжлүүлнэ

Page 26: 9.эрэмбэлэлтийн аргууд

Бөмбөлгөн эрэмбэлэлтийн арга

BubbleSort функц:

void BubbleSort(Type a[], int n){

int i,j;

for(i=n-1;i>0;i--)

for (j=0;j<i;j++)

if (a[j]>a[j+1])

swap(a,j,j+1);

}

Page 27: 9.эрэмбэлэлтийн аргууд

Бөмбөлгөн эрэмбэлэлтийн арга

Page 28: 9.эрэмбэлэлтийн аргууд

Бөмбөлгөн эрэмбэлэлтийн арга

Page 29: 9.эрэмбэлэлтийн аргууд

Бөмбөлгөн эрэмбэлэлтийн

арга

Page 30: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

Энэ аргыг 1959 онд Donald Shell гэдэг хүн оруулан

эрэмбэлэх аргын элемэнтийн эцсийн байрлалдаа

орох шилжилтийг хурдасган сайжруулж

боловсруулсан.

Оруулан эрэмбэлэх арга нь харьцуулалтыг өмнөх

элемэнтүүдтэй дэс дараалан хийж, шилжилтийг

зөвхөн зэргэлдээ байрлалын хувьд хийдэг учраас

удаан байдаг.

Байрыг нь солин эрэмбэлэх арга нь оруулан

эрэмбэлэх аргын зарчмаар ажиллах боловч

харьцуулалт болон шилжилтийг тодорхой алхмын

зайтайгаар хол хол хийдэг

Page 31: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

Тухайн алхамын зайг h гэж үзвэл массивын h алхам

дахь элемэнт бүрийн хувьд эрэмбэлэлтийг хийх ба

массивт бие биенээсээ үл хамаарах h ширхэг

эрэмбэлэгдсэн хэсэг үүснэ.

Массивын хувьд алхмын зайг тодорхойлохдоо массивын элемэнтийн тоог 2-т бүхлээр хуваах

замаар тодорхойлно

Page 32: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

Page 33: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

Page 34: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

Page 35: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

Page 36: 9.эрэмбэлэлтийн аргууд

Байрыг нь солин эрэмбэлэх арга-Shell sort

ShellSort функц:

void ShellSort(int a[],int n){

int h,i,j,temp,right,left;

h=n/2; while(h>0){ left=0; right=h; while(right<n){

i=right; temp=a[i];j=i-h; while(j>=0 && a[j]>temp){ a[j+h]=a[j]; j-=h; } a[j+h]=temp;left++;right++; }

h/=2; } }

Page 37: 9.эрэмбэлэлтийн аргууд

Дүгнэлт

• Эрэмбэлэлт гэж юу вэ?

• Дотоод эрэмбэлэлт гэж юу вэ?

• Сонгон эрэмбэлэх арга гэж юу вэ?

• Оруулан эрэмбэлэх аргын онцлог

• Бөмбөлгөн эрэмбэлэх арга гэж юу вэ?

• Эрэмбэлэх аргуудын ялгаа

Page 38: 9.эрэмбэлэлтийн аргууд

ЖИШЭЭ КОД SELECTION SORT

Page 39: 9.эрэмбэлэлтийн аргууд

SELECTION SORT #include <stdio.h>

void selection_sort();

int a[50], n;

main()

{

int i;

printf("\nEnter size of an array: ");

scanf("%d", &n);

printf("\nEnter elements of an array:\n");

for(i=0; i<n; i++)

scanf("%d", &a[i]);

selection_sort();

printf("\n\nAfter sorting:\n");

for(i=0; i<n; i++)

printf("\n%d", a[i]);

getch();

}

Page 40: 9.эрэмбэлэлтийн аргууд

SELECTION SORT void selection_sort()

{

int i, j, min, temp;

for (i=0; i<n; i++)

{

min = i;

for (j=i+1; j<n; j++)

{

if (a[j] < a[min])

min = j;

}

temp = a[i];

a[i] = a[min];

a[min] = temp;

}

}

Page 41: 9.эрэмбэлэлтийн аргууд

BUBBLE SORT программ бичнэ үү