Üye Girişi Yapınız     


    E-Posta
    

    Şifreniz
    



Şifremi Unuttum


Ana Sayfa Site Hakkında İletişim Ziyaretçi Defteri Döküman İndir Makale Ekle Haber Ekle

     Sıralama (Sorting)
     admin     15.03.2012     15:51:29

Bazı uygulamalarda bir grup sayının büyükten küçüğe, veya küçükten büyüğe, doğru sıralanması gerekebilir. Bu tip sıralama problemleri için çeşitli algoritmalar geliştirilmiştir. Sıralama mantığını anlamadan önce bir dizinin en büyük (veya en küçük) elemanının nasıl bulunduğunu inceleyelim. Program 10.3, bir dizinin en büyük elemanını bulup ekrana yazar.

Bazı uygulamalarda bir grup sayının büyükten küçüğe, veya küçükten büyüğe, doğru sıralanması gerekebilir. Bu tip sıralama problemleri için çeşitli algoritmalar geliştirilmiştir. Sıralama mantığını anlamadan önce bir dizinin en büyük (veya en küçük) elemanının nasıl bulunduğunu inceleyelim. Program 10.3, bir dizinin en büyük elemanını bulup ekrana yazar.

Bir dizinin en büyük elemanının bulunuşu

#include <stdio.h>

int main(void)

{

   int   a[10] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};

   int   k, eb;

   /* ilk eleman en büyük kabul ediliyor */

   eb = a[0]; 

   for(k=1; k<10; k++)

      if( a[k]>eb ) eb = a[k];

   printf("En buyuk eleman = %d\n",eb);

 return 0;

ÇIKTI

En buyuk eleman = 900 

En büyük sayıyı bulan bu algoritma oldukça kolaydır. 12. satırda eb = a[0]; ataması ile dizinin ilk elemanının en büyük olduğu varsayılır. Daha sonra büyüğe rastladıkça (15. satır) eb = a[k]; ile eb değişmektedir.

Program 10.3 bir dizinin en büyük elemanını bulur. En büyük elemanın kaçıncı indis (eleman) olduğu sorgulanmak istendiğinde: programdaki koşul yapısını aşağıdaki gibi değiştirmek yeterlidir. eb değiştikçe, i değişkeni en büyük elemanın indisini tutar.

for(k=0; k<10; k++)
{ if( a[k] > eb )
   { eb = a[k]; i = k; }
}

n elemanlı bir dizinin, elemanlarını büyükten küçüğe doğru sıralamak için çok popüler iki algoritma aşağıda verilmiştir.

Seçerek Sıralama (Selection Sort):
En büyük elemanı bul başa koy biçimindeki sıramadır. Algoritmanın uygulaması aşağıdaki programda gösterilmiştir.
Bu algoritmada kullanılan kombinasyon sayısı (algoritmanın karmaşıklığı): n*(n-1)/2 dir.

#include <stdio.h>
#define n 10
int main(void)
{ int a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};
  int i, j, k, eb;
/* Dizinin kendisi */
printf("Once : ");
for(k=0;k<n;k++)
 printf("%5d ",a[k]);
/* Sırala */
for(k=0; k<n; k++)
  {
    eb = a[k]; i = k;
    for(j=k+1; j<n; j++)
     if( a[j]>eb )
      { eb = a[j]; i = j; }
     a[i] = a[k];
     a[k] = eb;
 }
/* Sıralama bitti */
printf("\nSonra: ");
for(k=0; k<n; k++)
  printf("%5d ",a[k]);
printf("\n"); return 0; 

ÇIKTI

Once :   100  -250   400   125   550   900   689   450   347   700

Sonra:   900   700   689   550   450   400   347   125   100  -250

Kabarcık Sıralama (Bubble Sort):

Yanyana elemanları karşılaştırarak yer değiştir biçimde sıralamadır. Algoritmanın uygulaması aşağıdaki programda gösterilmiştir.
Bu algoritmanın karmaşıklığı: (n-1)2 dir.

#include <stdio.h>

#define n 10

int main(void)

{

   int   a[n] = {100, -250, 400, 125 ,550, 900, 689, 450, 347, 700};

   int   j,k,gecici;

   /* Dizinin kendisi */

   printf("Once : ");

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

      printf("%5d ",a[k]);

   /* Sırala */

   for(k=0; k<n-1; k++)

   for(j=0; j<n-1; j++)

      if( a[j]<a[j+1] ){

         gecici = a[j];

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

         a[j+1] = gecici;

      }

   /* Sıralama bitti */

   printf("\nSonra: ");

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

      printf("%5d ",a[k]);

   printf("\n");

  return 0; 

ÇIKTI
Once :   100  -250   400   125   550   900   689   450   347   700

Sonra:   900   700   689   550   450   400   347   125   100  -250

Facebook'ta Paylaş    
Diğer C / C İçerikleri       Tüm Yazılar        Ana Sayfa


  =>Soru Sorun veya Yorum Yazın...

İsim Giriniz :
  

  =>Yapılan Yorumlar...

aylin    28.05.2013    18:16:45

 benim bi sorum olacak verilen bir  A dizisinin mutlak değerini alıp büyükten küçüğe doğru sırala ve sıralamadan öncesi ve sıralamadan sonrası dizi durumunu ekrana yazdıran program c++ dilinde olması gerekiyor ve ama math.h ile olcak


aylin     28.05.2013    18:18:52

 sadece yol gösterin yeterli

 


admin    29.05.2013    10:29:45

Döngü içerisinde dizi elemanlarına erişin her bir elemanın mutlak değerini kendi indisine yeniden atayın. Hangi sayıların mutlak değeri alınacağında şöyle bulabilirsin. Döngü içinde kontrol ettiğin dizi elemanı eğer sıfırdan küçükse elemanı kendisiyle çarpıp (eksi x eksi= artı) yeniden kendi indisine ata. Eğer Saı pozitifse hiç bir işleme sokma. Sonra da sıralamayı yukarıda anlatılan algoritmalardan biriyle gerçekleştir. Bilmem yardımcı olabildim mi?


gulsah    30.12.2014    12:03:33

geçici derken neyi kastediyorsunuz.


admin    31.12.2014    12:47:12

geçici : yeri değiştirilecek sayının geçici olarak tutulduğu değişkenin adı. Mesela şöyle düşün. Sol elinde ve sağ elinde birer cisim var. Sol elindeki cisimle sağ elindeki cismi yer değiştirmek istiyorsun. Bu durumda ne yapabilirsin? Burada geçici değişkenini üçüncü bir el gibi düşün ve önce sol elindeki cismi üçüncü ele ver. Sol elin boş kaldı. Sağ elindeki cismi sol eline ver. Sağ elin boş kaldı. Ve son olarak üçüncü eldeki cismi(Bu cisim ilk başta sol elinde bulunan cisimdir) sağ eline ver. Böylece yer değiştirme işlemi tamamlanmış olur.