1. Saralash algoritmi bu roʻyxatdagi elementlarni saralash algoritmi. Agar roʻyxat elementida bir nechta maydon boʻlsa, saralash amalga oshiriladigan maydon saralash kaliti deb ataladi
6. saralash
1. Saralash algoritmi – bu roʻyxatdagi elementlarni saralash algoritmi. Agar roʻyxat elementida bir nechta maydon boʻlsa, saralash amalga oshiriladigan maydon saralash kaliti deb ataladi. Amalda raqam koʻpincha kalit sifatida ishlatiladi va ba’zi ma’lumotlar algoritm ishlashiga hech qanday ta’sir koʻrsatmaydigan qolgan maydonlarda saqlanadi. Ehtimol, boshqa hech qanday muammo saralash muammosi kabi juda koʻp turli xil yechimlarni keltirib chiqarmagan. Butun dunyoda tan olingan eng yaxshi algoritm bormi? Umuman aytganda, yoʻq. Biroq, kirish ma’lumotlarining taxminiy xususiyatlarini hisobga olgan holda, siz eng yaxshi ishlaydigan usulni tanlashingiz mumkin. Saralash usullari juda koʻp, ularning har biri oʻzining afzalliklari va kamchiliklariga ega. Tartiblash algoritmlari katta amaliy ahamiyatga ega, ular oʻzlari uchun qiziqarli. Bu juda chuqur oʻrganilgan informatika sohasi axborot qidirish tizimlarida, harbiy sohada va bank sohalarida koʻproq qoʻllaniladi. Ammo hozirgi kunda axborot oqimini tartiblash masalasi deyarli har bir sohaga kirib bordi
2. Algoritmlarni saralashga boʻlgan umumiy ilmiy qiziqishdan tashqari, har bir algoritmda uning murakkabligi deb ataladigan narsani baholash qiziq. Murakkablik algoritmning boshlangʻich bosqichlarining maksimal soni sifatida tushuniladi. Tartiblash misollari algoritmni murakkablashtirish orqali koʻrsatilishi mumkin, garchi hozirda aniq 52 usullar mavjud boʻlsa-da, siz samaradorlikda sezilarli yutuqqa erishishingiz mumkin. Massivlarni saralash masalasini yechishda odatda qoʻshimcha xotiradan foydalanishni minimallashtirish talabi qoʻyiladi, bu esa qoʻshimcha massivlardan foydalanishga yoʻl qoʻyilmasligini anglatadi. Quyidagi koʻrsatkichlar ham muhimdir: • Xotira. Bir qator algoritmlar ma’lumotlarni vaqtincha saqlash uchun qoʻshimcha xotira ajratishni talab qiladi. Amaldagi xotirani baholashda boshlangʻich massiv egallagan joy, kirish ketma-ketligidan mustaqil sarflangan xotira, masalan, dastur kodini saqlash uchun ajratilgan joy hisobga olinmaydi. • Turgʻunlik. Doimiy saralash teng elementlarning nisbiy holatini oʻzgartirmaydi. Ushbu xususiyat juda foydali boʻlishi mumkin, agar ular bir nechta maydonlardan iborat boʻlsa va saralash ulardan biri tomonidan amalga oshirilsa. Barcha saralash usullarini ikkita katta guruhga boʻlish mumkin: • Saralashning bevosita usullari; • Takomillashtirilgan saralash usullari; Toʻgʻridan-toʻgʻri tartiblash usullari usul asosida yotadigan prinsipga koʻra, uchta kichik guruhga boʻlinadi: • oddiy qoʻshimchalar boʻyicha saralash (qoʻshish); • tanlash (saralash) boʻyicha saralash; • Almashish boʻyicha saralash ("Pufakchali" saralash)
4. Pufakchali saralash (Bubble sort) algoritmining C++ dastur kodi. Ushbu algoritm ta’limiy hisoblanadi va samaradorligi pastligi sababli amalda deyarli hech qachon qoʻllanilmaydi: u kichik elementlar (ular "toshbaqalar" deb nomlanadi) massiv oxirida joylashgan testlarda sekin ishlaydi. Biroq, koʻplab boshqa usullar bunga asoslangan, masalan, Sheyker saralash va taroqsimon saralashlari. Vaqt boʻyicha murakkabligi: Eng yomon baho: O(n2 ) Oʻrtacha baho: O(n2 ) Eng yaxshi baho: O(n) void bubbleSort(int arr[], int n) { int i, j; bool swapped; for (i = 0; i < n-1; i++) { swapped = false; for (j = 0; j < n-i-1; j++) { if (arr[j] > arr[j+1]) { swap(&arr[j], &arr[j+1]); swapped = true; } } if (swapped == false) break; } }
6. #include #include #include
int main() {
// Ixtiyoriy son generatori
std::random_device rd;
std::mt19937 generator(rd());
std::uniform_int_distribution distribution(1, 100);
// Massivni to'ldirish
const int size = 20;
int arr[size];
for (int i = 0; i < size; ++i) {
arr[i] = distribution(generator);
}
std::cout << "Massiv: ";
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
7. Eng yaxshi baho: O(n) - Eng yaxshi holatda pufakchali saralashi, to'liq tuzilish bo'lsa ham, saralashni yakunlash uchun faqat bir marta o'tish va qarshilangan o'zgarishni algoritmi uchun belgilanishi. Bu holatda. murakkabligi minimal bo'ladi.
O'rtacha baho: O(n^2) - Pufakchali saralash algoritmi murakkabligi o'rtacha vaqtda O(n^2) bo'ladi. Ush algoritm har bir elementni qiyoslash va rejalashtirish uchun sonli marta o'tish talab qiladi.
Eng baho: O(n^2) - Pufakchali saralash algoritmi eng yomon holatda ham O(n^2) murakkablikka ega bo'ladi. Bu vaqtda saralash tizimi to'liq tesadufiy har bo'lsa ham, algoritm bir elementni qiyoslash va natija uchun sonli marta o'tishni bajarganligi tufayli murakkablik hosil qiladi.
8. Almashtirish funksiyasi, ikkita o'zgaruvchining narxlarini boshqarish (swap) boshqarishni boshqarish. Bu funksiya o'zgaruvchilar tashqi qiymatlarni rejalashtirishning asosiy mexanizmini ta'minladi. Swap funksiyasining ishlashini sozlashdir:
O'zgaruvchilar narxlarini yo'nalishi: Swap funksiyasi, ikkita o'zgaruvchining narxlarini yuklaydi. Bu, o'zgaruvchilarning narxlari o'zaro almashtiriladi, funktsiyalar ichida berilgan o'zaro bog'lanish orqali amalga oshirish.
Qiymatlarni o'zgaruvchilar yo'nalishi: Swap funktsiyalari, o'zgaruvchilarni rejalashtirish uchun o'zgaruvchilar bilan ishlaydi. Bu, o'zgaruvchilarning o'zgartirmaydi, balki ularning manzillarini o'zgartirmaydi.
9. #include using namespace std;
void bubbleSort(int arr[], int size) {
for (int i = 0; i < size - 1; ++i) {
for (int j = 0; j < size - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
// Qiymatlarni almashtirish
arr[j] = arr[j] + arr[j + 1];
arr[j + 1] = arr[j] - arr[j + 1];
arr[j] = arr[j] - arr[j + 1];
}
}
}
}
int main() {
const int size = 10;
int arr[size] = {9, 4, 2, 7, 1, 5, 8, 3, 6, 10};
cout << "Boshlang'ich massiv: ";
for (int i = 0; i < size; ++i) {
cout << arr[i] << " ";
}
bubbleSort(arr, size);
cout << "Saralangan massiv: ";
for (int i = 0; i < size; ++i) {
cout << arr[i] << " ";
}
return 0;
}
10. #include using namespace std;
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
void bubbleSort(int arr[], int size) {
for (int i = 0; i < size - 1; ++i) {
for (int j = 0; j < size - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
// Qiymatlar o'zgarishi
swap(arr[j], arr[j + 1]);
}
}
}
}
int num = dist(rng);
arr[i] = num % 2 == 0 ? num : num + 1; // Faqat juft sonlar
}
cout << "Boshlang'ich massiv: ";
for (int i = 0; i < size; ++i) {
cout << arr[i] << " ";
}
cocktailSort(arr, size);
std::cout << "Saralangan massiv: ";
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << " ";
}
return 0;
}
25. Tanlash boʻyicha saralash (Selection sort). Birinchidan, siz massivning kichik qismini koʻrib chiqishingiz va undagi maksimal (yoki minimal) miqdorni topishingiz kerak. Keyin tanlangan qiymat birinchi saralanmagan elementning qiymati bilan almashtiriladi. Ushbu qadam massivning saralanmagan ichki qismlari tugamaguncha takrorlanishi kerak. Vaqt boʻyicha murakkabligi: Eng yomon baho: O(n2 ) Oʻrtacha baho: O(n2 ), Eng yaxshi baho: O(n2 ) void selectionSort(int arr[], int n) { int i, j, min_idx; for (i = 0; i < n-1; i++) 61 { min_idx = i; for (j = i+1; j < n; j++) if (arr[j] < arr[min_idx]) min_idx = j; swap(&arr[min_idx], &arr[i]); } } Ushbu algoritmlarning elementlari soni bir xil boʻlgan holatda qanday vaqt ichida bajarilishi va sarflangan xotira hajmi haqidagi qiyosiy jadval quyida berilgan. Sinov oʻtkaziladigan kompyuter quyidagi xususiyatlarga ega: AMD A6-3400M 4x1.4 GHz, 8 Gb operativ xotira, Windows 10 x64 build 10586.36
27. #include #include using namespace std;
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
void cocktailSort(int arr[], int size) {
bool swapped = true;
int start = 0;
int end = size - 1;
while (swapped) {
swapped = false;
// Kamayish tartibida boshdan oxirgacha o'tish
for (int i = start; i < end; ++i) {
if (arr[i] > arr[i + 1]) {
swap(arr[i], arr[i + 1]);
swapped = true;
}
}
if (!swapped) {
break;
}
swapped = false;
--end;
// Kamayish tartibida oxirgacha boshdan o'zgarish
for (int i = end - 1; i >= start; --i) {
if (arr[i] > arr[i + 1]) {
swap(arr[i], arr[i + 1]);
swapped = true;
}
}