Array (Dizi)

Hafızada dil tarafından ardışık olarak tutulan özdeş bölümlere verilen isimdir.
Yani basitçe bir değişken tek bir bilgi birimi tutabilirken bu değişkenlerden birden fazla adışık uniteye ihtiyaç duyulursa dizi tanımlanabilir.
C/C++ dilindeki örnek integer dizi tanımı:

int a[10]; /* 10 elemanlık bir dizi tanımla */
for(int i = 0 ; i< 10 ; i++) /* 0'dan 10'a kadar dönen bir döngü oluştur */
a[i]=i; /* a dizisinin i. elemanına i değerini koy */

Aynı kod JAVA dilinde yazılırsa

int a[] = new int [10]; /* 10 elemanlık bir dizi tanımla */
for(int i = 0 ; i< 10 ; i++) /* 0'dan 10'a kadar dönen bir döngü oluştur */
a[i]=i; /* a dizisinin i. elemanına i değerini koy */

şeklinde c/c++ yazımına oldukça benzeyen bir görüntü sergiler.
Ve her iki dilde de yazılan kodun hafızadaki görüntüsü aşağıdaki şekildedir:

1 2 3 4 5 6 7 8 9

Diziler (Arrays), hafızada row major order veya column major order olarak tutulabilirler.

Dizilerin ayrıca ilk değeri atarnırken aşağıdaki şekilde yazılabilir:

int a[] = { 2, 3, 9, 8, 15, -6};

Yukarıdaki bu tanımlama sonucunda dizinin indisleri ile birlikte görüntüsü şu şekildedir:

Yukarıdaki dizide de dikkat edilirse, dizinin başlangıç indisi 0’dır. Dolayısıyla boyutu örneğin 5 olan bir dizinin en son erişilebilecek elemanı 4’tür. Yukarıdaki bu örnek dizi için erişim aşağıdaki şekilde yapılabilir:

a[0] = 2;

a[3] = 8; // düzeltildi (Fatih Bey’e teşekkürler)

a[5] = -6;

yukarıda örnekleri verilen eşitlikler rastgele seçilmiştir ve bu şekilde dizinin istenen elemanına erişilebilir. Örneğin C dilinde :

printf(“%d”,a[3]);

yazılması halinde a dizisinin 3. elemanına erişilmiş olur ve örneğin yukarıdaki örnek dizi için bu değer ekrana 8 basılmasıdır.

Dizilerde yer değiştirme işlemi (Swap).

Dizilerde farklı adresteki değerlerin yer değiştirmesi işlemine takas (swap) adı verilir. Örneğin yukarıdaki dizide a[3] ile a[5] elemanlarının yer değiştirmesi sonucunda, dizideki verilerin diziliminin aşağıdaki şekilde olması beklenir:

2 3 9 -6 15 8

Görüldüğü üzere dizinin 5. elemanı olan -6 ile 3. elemanı olan 8 yer değiştirmişlerdir. Bu yer değiştirme işlemi sırasında aşağıdakine benzer bir kodun yazılması gerekir:

int temp = a[3]; // dizinin 3. elemanının üzerine yazmadan farklı bir yere kopyalıyoruz

a[3] = a[5]; // şimdi üzerine yazabiliriz.

a[5] = temp; // yer değiştirme tamamlandı

Yukarıdaki bu durum dolu iki kabın içindekileri değiştirmek için 3. bir kaba ihtiyaç duyulmasına benzetilebilir. Önce kaplardan birisi 3. kaba boşaltılır ardından diğer kaptaki veri, boş kaba konulup, 3. kaptaki veri ise yeni boşalan kaba konulur. Sonuçta iki kaptaki veri yer değiştirmiş olur.

Dizideki en küçük sayıyı başa koyan kod

Yukarıdaki takas işlemi (swap) pekçok yerde kullanılmaktadır. Bunlardan birisi de öne eklemeli sıralama (insert front sort) algoritmasıdır. Bu algoritmada, dizideki en küçük sayı bulunup dizinin başına konulmaktadır. Elbette dizinin başındaki sayı da en küçük sayının bulunduğu indise konulmaktadır.  Algoritmanın detayı için ilgili yazı okunabilir ancak bu yazı içerisinde sadece en küçük sayıyı bulup dizinin başındaki sayı ile takaslayan (yer değiştiren) kodu yazıp inceleyelim:

Yukarıdaki kodun ilk  satırında anlık olarak elimizdeki en küçük değer 0. indiste kabul edilmektedir. Amacımız dizide daha küçük bir sayıyı arayıp bulmaktır. Buradaki min değerinin gösterdiği adreste bulunan dizi değeri ile dizinin bütün elemanları karşılaştırılır. Kodun 5. satırındaki koşulu sağlayan ve bizim en küçük kabul ettiğimiz dizi değerinden daha küçük bir eleman bulununca, artık elimizdeki en küçük elemanın bu yeni küçük elemanın bulunduğu adreste olduğu kabul edilerek min değişkeni bu yeni küçük elemanın bulunduğu indisi tutar.

Bu işlem dizi sonuna kadar tekrar edilir ve kodun 10-12. satırları arasında bulunan bu adresteki değer dizinin 0. elemanı (yani ilk elemanı) ile takaslanır.

Burada görüldüğü üzere dizideki en küçük sayıyı bir değişkende tutmak yerine, dizideki en küçük sayının bulunduğu indisi bir değişkende tutuyoruz. Bu sayede en küçük sayının nerede bulunduğunu biliyor ve dizinin başındaki sayı ile yer değiştirirken hangi indisteki değere, dizinin eskiden ilk elemanı olan sayının konulacağını bulmuş oluyoruz.

Yorumlar

  1. fatih

    for(int j=0;j<5;j++){
    int indis=j;
    int ek=a[j];
    for(int i=j;ia[i]){
    .Hocam dizilerde yer değiştirme kodunu yazarken bu kısımdaki bolum kafama takıldı.ozellikle indis kısmını neden yazmıştık?gorevi nedir?Simdiden teşekkur ederim iyi calısmalar..
    ek=a[i];
    indis=i;

  2. fatih

    peki yukarıda a[3] icin ucuncu elemanına ulasılır yazıyor.saymaya 0 dan basladıgımızda a[3] tabloda da belirtildigi gibi veri değeri 8 olmazmı?

  3. Fatih

    int a[5];
    for(int i=0;i<5;i++){
    scanf("%d",&a[i]);
    }
    for(int j=0;j<5;j++){
    int indis=j;
    int ek=a[j];
    for(int i=j;ia[i]){
    ek=a[i];
    indis=i;
    }
    }
    int temp=a[j];
    a[j]=ek;
    a[indis]=temp;

    Hocam bu kodu daha sade sekilde de yazabilirmiyiz?

  4. Fatih

    for(int j=0;j<5;j++){
    int indis=j;
    int ek=a[j];
    for(int i=j;ia[i]){
    ek=a[i];
    indis=i;
    hocam ve kodun bu parcası sadece kucuk elemanı bulmayamı yarıyo yoksa aynı zamanda yer değiştirme işleminide icinde barındırıyormu?

  5. Fatih

    int temp=a[j];
    a[j]=ek;
    a[indis]=temp;
    hocam bu kodda son olarak kucuk bişe daha sormak istiyorum,bu yerdeğiştirme bolumunde hangi iki materyal yer değişmiştir?

  6. Şadi Evren ŞEKER Article Author

    Sırasıyla cevaplarınız:
    1. Yazıdada açıklamaya çalıştım, indis, dizideki en küçük elemanın bulunduğu adresi tutmaya yarıyor.
    2. Haklısınız a[3]=8 olmalı, yazıda ilgili düzeltmeyi yaptım.
    3. kodun sadeliğinden neyi kastettiğinizi bilmiyorum ancak her hal-ü kârda iç içe en az iki döngü bulunmalıdır. Bu da algoritma karmaşıklığı açısından birşeyin değişmeyeceği anlamına gelir.
    4. verdiğiniz koddaki iki döngü hiçbir işe yaramıyor, hatalı. Doğrusu yukarıdaki yazıda bulunuyor ve yukarıdaki yazıda bulunan “min” değişkeni veya sizin hatalı da olsa vermeye çalıştığınız “indis” değişkeni, dizideki en küçük sayının indisini (Adresini) tutmaya yarıyor.
    5. ek, dizideki en küçük sayının değerini, indis de en küçük sayının adresini tutmak şartıyla, verdiğiniz kod, dizideki j. elemanı en küçük elemanla yer değiştirir. j değerinin döngü değişkeni olduğunu kabul edersek, dizideki en küçük sayıyı, sıradaki sayı ile yer değiştirir.

  7. Yılmaz KARAAĞAÇ

    peki 100 elemanlı bir dizi olsun. 1-100 arası sayılar olsun bu dizide. Sıralı değil karışık. Herhangi bir sayı çıkarttım. hangi sayıyı çıkardığımı nasıl buluruz?

  8. ArdaEren

    hocam bir sorum olucak çok uğraştım yapamadım
    Soru:
    10 elemanlı X dizisinin en büyük en küçük elemanlarının yerini değiştiriniz.

  9. Rüştü Cenkoğlu

    Merhabalar Sadi bey size bir kaç sorum olucak cevaplarsanız sevinirim.
    Her elemanı A(4,3) dizisinin satır elemanlarının en büyüğü olan B dizisini oluşturunuz.
    A(4,3) dizisinin elemanlarının toplamını bulunuz. Dizinin tüm elemanlarını bu toplama bölerek yeni B(4,3) dizisini oluşturun.

  10. hamide

    100 ve 400 arasında 3ün veya 5 in katı olan sayıların listesini oluşturan programı yazar mısınız lütfen

  11. Burak Kaya & Çağrı Kalkan

    hocam array(dizi) youtube videosunda ilk 20 fibonacci sayısını hesaplayarak diziye yerleştiren program yazınız. dediğiniz kodda hata var hocam bilginize sunarım a[i]=a[i-1]+a[i-2]; sonra printf kodu gelmesi gerekiyor hocam.aşağıdaki gibi;
    printf(“a[%d] = %d \n”,i,a[i]);

    Bilgileriniz ışık oluyor bize hocam herşey için teşekkürler. 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir