6-mavzu. Ma'lumotlarni saralash algoritmlari. Reja: Saralashning yaxshilangan usullari va ularning samaradorligi. Quiksort – tez saralash usuli


Download 77.81 Kb.
bet2/3
Sana02.06.2024
Hajmi77.81 Kb.
#1836586
1   2   3
Bog'liq
6-mavzu

Dastur kodi
#include
#include
using namespace std;
struct table{
int t;
string FIO;
};
int q=0;
void qs(table *a,int first,int last){
int i = first, j = last;table x =a[(first + last) / 2];
do {
while (a[i].FIO < x.FIO) i++;
while (a[j].FIO > x.FIO) j--;
if(i <= j) {
if (i < j){ swap(a[i], a[j]);q++;}
i++;
j--;
}
} while (i <= j);
if (i < last)
qs(a,i,last);
if (first < j)
qs(a,first,j);
}
int main(int args, char *argv[])
{ int n;cout<<"n=";cin>>n;
table talaba[n];
for(int i=0;i
talaba[i].t=i+1;
cin>>talaba[i].FIO;
}
qs(talaba,0,n-1);
for(int i=0;i
cout<
cout<<"quicksort algoritmi "<
system("PAUSE");
}
Birlashtirish orqali (MergeSort) saralash. MergeSort O(NlogN) da ishlaydigan optimal saralash algoritmlaridan biri. Eng yaxshi holatda ham, eng yomon holatda ham O(NLogN) assimptotikada ishlaydi. Hamda, u barqaror saralaydi, ya’ni sonlar ketma-ketligini buzmagan holda. Masalan, sonlardan tashqari, ularning kalit sonlari bo‘lsa, kalit soni 3 bo‘lgan 2 soni kalit soni 5 bo‘lgan 2 sonidan oldin kelsa, MergeSortda saralangandan so‘ng ham kalit soni 3 bo‘lgan 2 soni oldin keladi. QuickSort da doim ham bu shart bajarilavermaydi.
Algoritmning ishlash prinsipi quyidagicha: Massivni teng ikkiga bo‘lamiz. O‘ng tomonni alohida saralaymiz, chap tomonni alohida. So‘ng ikki saralangan qismni O(n) ya’ni n ta operatsiyada qo‘shib, to‘liq saralangan massiv olamiz. Aynan shu operatsiya, ya’ni qo‘shish - Merge ning hisobiga algoritm shunday nom olgan. Endi chap va o‘ng tomonlarini saralash uchun ham, ularni ikkiga bo‘lib xudi shu ishni bajaramiz va hk. Massivni bo‘lishni to unda 2 ta element qolguncha davom ettiramiz.
Faraz qilaylik, bizda Merge(a: Array of Integer, Left, Mid, Right: Integer) funksiyasi bo‘lsin. YA’ni, a massivning L -Mid qismi saralangan, Mid + 1 - R qismi saralangan. Shu qismlarni qo‘shib, L –R kesmada saralangan qilish. Bunda Mid L va R kesma o‘rtasi.

3.4-rasm. 3.5-rasm.

3.6-rasm. 3.7-rasm.

3.8-rasm. 3.9-rasm.



3.10-rasm 3.11-rasm.

3.12-rasm. 3.13-rasm.
[L, R] oraliq m=(L+R) / 2 o‘rtasi orqali ikkita [L, m] va [m+1, R] oraliqqa ajratiladi va ular alohida saralanadi.

3.14-rasm.

Shunday Merge funksiya asosida MergeSortni quyidagicha yozish mumkin.


#include
using namespace std;
int helper[1000001];
void Merge(int a[],int left,int middle,int right){
for(int i=left,j=middle,k=left;k
if(i==middle){ helper[k]=a[j++];continue;}
if(j==right ){ helper[k]=a[i++];continue;}
helper[k]=( a[i]< a[j])?a[i++]: a[j++];
}
for(int k=left;k
}
void MergeSort(int a[],int left,int right){
if(right-left==1)return;
int middle=(left+right)>>1;
MergeSort(a,left,middle);
MergeSort(a,middle,right);
Merge(a,left,middle,right);
}
int main(){
int a[10000], n , i;
cin>>n;
for(i=0;i>a[i];
MergeSort(a,0,n);
for(i=0;i
return 0;
}


Download 77.81 Kb.

Do'stlaringiz bilan baham:
1   2   3




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling