En basit sıralama aligoritmalarından birisidir ama büyük dizilerde çok yavaş kalmaktadır. Eğer büyük dizilerde sıralama yapacaksanız çok zaman alır. Aligoritmanın karmaşıklığı en kötü durumda(tersten sıralı) O(n²) en iyi durumda ise O(n²/2) dir.
Çalışma mantığı
Örneğin dizimiz aşağıdaki gibi olsun.
88,12,76,55,36,45,1,35
- ilk iki sayıyı al(88,12)
- iki sayıyı karşılaştır
- eğer aldığın ilk sayı ikinci sayıdan büyük ise yer değiştir
C Kodu
#include <stdio.h> #include <stdlib.h> void bubble_sort(int dizi[],int n) { int gecici; int i,j; for(i=1;i<n;i++) { for(j=0;j<n-1;j++) { if(dizi[j]>dizi[j+1]) { gecici=dizi[j]; dizi[j]=dizi[j+1]; dizi[j+1]=gecici; } } } } int main(int argc, char *argv[]) { int dizi[9]={88,12,76,55,36,45,1,35}; bubble_sort(dizi,9); int i; for(i=0;i<9;i++) printf("%d\t",dizi[i]); return 0; }
Yukarıdaki kodumuzu biraz daha düzenleyelim ve nasıl çalıştığına daha detaylı bakalım.
#include <stdio.h> #include <stdlib.h> void bubble_sort(int dizi[],int n) { int gecici; int i,j; printf("Siralanma adimlari\n"); for(i=1;i<n;i++) { for(j=0;j<n-1;j++) { if(dizi[j]>dizi[j+1]) { gecici=dizi[j]; dizi[j]=dizi[j+1]; dizi[j+1]=gecici; dizi_yaz(dizi,n); } } } } void dizi_yaz(int dizi[],int n) { int i; for(i=0;i<n;i++) printf("%d\t",dizi[i]); } int main(int argc, char *argv[]) { int dizi[]={88,12,76,55,36,45,1,35,0,15}; int n=(sizeof dizi / sizeof *dizi); printf("Siralanmamis dizi\n"); dizi_yaz(dizi,n); bubble_sort(dizi,n); return 0; }
Çıktı:
Yazdığımız kodda dikkat ettiyseniz iç içe iki tane for döngüsü kullanıyoruz. İçerideki döngü işini bitirdiğinde dizideki en büyük eleman yani 88 en sona yerleşmiş oldu. Döngü ikinci kez çalışıp işini bitirdiğinde ise en büyük ikinci eleman yani 76 sıralanmış bir şekilde yerini almış oldu. Ayrıca dizimiz sıralı sayılardan oluşursa gereksiz yere bu kod çalışmış olacak bunu da kontrol altına almamız gerekiyor.
void bubble_sort(int dizi[],int n) { int gecici; int i,j; printf("Siralanma adimlari\n"); for(i=1;i<n;i++) { int sirali_mi=1; for(j=n-1;j>0;j--) { if(dizi[j-1]>dizi[j]) { sirali_mi=0; gecici=dizi[j]; dizi[j]=dizi[j+1]; dizi[j+1]=gecici; dizi_yaz(dizi,n); } } if(sirali_mi==1) break; } }
Bir yanıt yazın