Pufaksimon saralash algoritmi
Ushbu usulning g'oyasi quyidagicha: n - 1 marta massivda quyidan yuqoriga qarab yurib kalitlar jufti-jufti bilan taqqoslanadi. Agar pastki kalit qiymati yuqoridagi jufti kalitidan kichik bo'lsa, u holda ularning o'rni almashtiriladi.
Misol : massiv - 4, 3, 7, 2, 1, 6.
Pufaksimon saralash usulida massiv elementlarining o'rnini almashtirish
Pufaksimon usulni massiv elementlarida pastdan yuqoriga va yuqoridan pastga o'tishni bir vaqtda amalga oshirish natijasida yaxshilash mumkin
Massivni pufaksimon saralashga misol
Rasmda berilgan misolda 5 ta elementdan iborat massiv berilgan. Demak, massivda pastdan yuqoriga (yuqoridan pastga) o'tishlar soni 5-1=4 marta bo'ladi. Misoldan ko'rinib turibdiki, algoritm ichki siklda 3-qadamdan boshlab massivni “bekor” qayta ishlaydi, 4-qadamni bajarmasa ham bo'ladi.
Berilgan usullarning afzalligi:
1) Eng sodda algoritm;
2) Amalga oshirish sodda;
3) Qo'shimcha o'zgaruvchilar shart emas.
Kamchiliklari:
1) Katta massivlarni uzoq qayta ishlaydi;
2) Har qanday holatda ham o'tishlar soni kamaymaydi.
“Pufaksimon” usulni yaxshilash
1) Agar massivda o'tishlar nafaqat yuqoridan pastga, balki bir vaqtning
o'zida pastdan yuqoriga ham bo'lsa, u holda “yengil” elementlar “yuqoriga suzib” chiqadi va “og'ir” elementlar esa “cho'kadi”.
2) Massivda “bekor” o'tishni yo'q qilish uchun, tashqi siklda massiv saralanganligini tekshiruvchi belgi qo'yish lozim.
for (int i=0;i
for (int j=n-1;j>i;j--)
if (a[j] < a[j - 1]){
int x= a[j - 1];
a[j - 1] = a[j];
a[j] = x;
}
O'rinlashtirish va taqqoslashlar soni: (n* log( n )).
Massivda binar qidiruv yordamida a elementni bor yoqligini aniqlash dasturi
Binar qidiruvning asosiy g'oyalaridan biri ketma-ket ikkiga bo'lishga asoslanadi, ya'ni berilgan a ni massivning o'rtadagi elementi bilan solishtiradi, agar katta bo'lsa oxiri va o'rtasi orasidagi massivni oladi, agar kichkina bo'lsa boshi va o'rtasi orasidagi massivni oladi, va har safar shu jarayon takrorlanib boradi toki a element solishtirilayotgan massivning elementga teng bo'lgunicha yoki massivning elementlari qolmaguncha.
Biz bitta taqqoslashdan so'ng massivning yarim elementlarini hisobga olmasak ham bo'ladi.
1.a ni o'rtadagi element bilan solishtiramiz.
2. Agar rost bo'lsa, o'rtadagi elementni qaytaramiz.
3. Agar x katta bo'lsa, a ni massivni o'ng yarmini ichidan qidiramiz, yuqoridagi ketma-ketlikni bajargan holda.
4. Aks holda chap yarmi bilan binar qidiruvni amalga oshiramiz.
#include
int binarqidiruv(int arr[], int l, int r, int a)
{
if (r >= l)
{
int mid = l + (r - l)/2;
if (arr[mid] == a)
return mid;
if (arr[mid] > a)
return binarqidiruv(arr, l, mid-1, a);
return binarqidiruv(arr, mid+1, r, a);
}
return -1;
}
int main(void)
{
int arr[] = {2, 3, 4, 10, 40};
int n = sizeof(arr)/ sizeof(arr[0]);
int a = 10;
int natija = binarqidiruv(arr, 0, n-1, a);
(natija == -1)? printf("a soni massivni ichidan topilmadi.")
: printf("a soni massivning %d - elementi.", natija);
return 0;
}
Do'stlaringiz bilan baham: |