February 06, 2022

Merhaba,

Kısa geçiyorum çünkü şu an toplantıdayız. AVL tree konusunu işlerken bir hatam sonucu Heap Tree konusuna girdik. Hatta şu an Range konusundayız. Bu kodları Kayhan hocanın dersini izlerken yazmıştım ve D olanaklarını kullandım. Toplantıya çok faydalı olacağını düşünüyorum.

enum { MIN = 10, MAX = 20 }
import std.stdio, std.range, std.random;

class HeapSort {
  this(int[] data) {
    foreach(d; data)
    {
      this.ekle(d);
    }
  }

  void ekle(int e)
  in(ES < MAX) {
    this.data[ES++] = e;
    this.heapifyUp(ES-1);
  }

  int getir() {
    return this.data[0];
  }

  void çıkart() {
    if(this.empty) return;

    int değer = this.data[--ES];
    this.data[0] = değer;
    this.heapifyDown(0);
  }

  bool empty() {
    return ES == 0;
  }

  void popFront() {
    this.çıkart;
  }

  int front() {
    return this.getir;
  }

  auto length() {
    return ES;
  }

  private:
    int[MAX] data;
    int ES;

    int leftIndex(int i) {
      return i*2+1;
    }

    int rightIndex(int i) {
      return i*2+2;
    }

    int parentIndex(int i) {
      return (i-1)/2;
    }

    void heapifyUp(int i) {
      if(i == 0) return;

      int parent = parentIndex(i);
      if(this.data[parent] > this.data[i]) {
        int temp = this.data[i];
        this.data[i] = this.data[parent];
        this.data[parent] = temp;

        this.heapifyUp(parent);
      }
    }

    void heapifyDown(int i) {
      int sol = leftIndex(i);
      int sağ = rightIndex(i);
      int min;
      if(sol >= ES) {
        if(sağ >= ES) {
          return;
        } else min = sol;
      } else {
        if(this.data[sol] < this.data[sağ]) {
          min = sol;
        } else min = sağ;
      }
      if(this.data[min] < this.data[i]) {
        int temp = this.data[i];
        this.data[i] = this.data[min];
        this.data[min] = temp;

        this.heapifyDown(min);
      }
    }
}

void çıkartGöster(HeapSort HS, int x) {
  foreach(_;0..x) HS.çıkart();
  HS.data.writeln(": TÜKENMİŞ HALİ");
  auto len = HS.length;
  if(len) {
    writef!"-%s^"(replicate("----", len - 1));
  }
  writefln(" ES (Eleman Sayısı): %d\n", len);
}

void main()
{
  //int[] arr =  [5, 8, 11, 13, 9, 25, 35];/*
  writeln("RASGELE:");
  auto RND = Random(41);
  auto arr = MIN.iota(MAX).array.
                  randomShuffle(RND);//*/
  arr.writeln("\nGİRDİLER: ", arr.length);

  auto test = new HeapSort(arr);
  test.data.writeln(": KURULMUŞ HALİ");

  //"SIRALI: \n".writeln(test);/* Tek tek tüketme:
  çıkartGöster(test, 1);
  çıkartGöster(test, 2);//*/

  çıkartGöster(test, 0);
} /* ÇIKTISI:
RASGELE:
[19, 15, 13, 14, 11, 16, 12, 17, 18, 10]
GİRDİLER: 10
[10, 11, 12, 17, 13, 16, 15, 19, 18, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: KURULMUŞ HALİ
[11, 13, 12, 17, 14, 16, 15, 19, 18, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: TÜKENMİŞ HALİ
---------------------------------^ ES (Eleman Sayısı): 9

[13, 14, 15, 17, 19, 16, 18, 19, 18, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: TÜKENMİŞ HALİ
-------------------------^ ES (Eleman Sayısı): 7

[13, 14, 15, 17, 19, 16, 18, 19, 18, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]: TÜKENMİŞ HALİ
-------------------------^ ES (Eleman Sayısı): 7
*/