// gönderdiğimiz veriyi öbeğe eleman olarak ekleyen fonksiyonumuz voidObek::ekle(int veri) { // vektörümüzün sonuna elemanımızı ekliyoruz obek.push_back(veri); // son eklenen elemanı yukarıda uygun yere taşıyoruz yukariTasi(obek.size() - 1); }
void yazdir();
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// öbeğimizi baştan sona yazdiran fonksiyonumuz voidObek::yazdir() { vector<int>::iterator yer = obek.begin(); cout << "Öbek: ";
// vektörü başından sonuna kadar dolaşıp sırayla yazdırıyoruz while (yer != obek.end()) { cout << *yer << " "; ++yer; }
cout << endl; }
int sag(int ebeveyn);
1 2 3 4 5 6 7 8
// gönderilen ebeveynin sağ çocuğunu bulan ve geriye gönderen fonksiyon intObek::sag(int ebeveyn) { // sağ çocuğun olması gerektiği yerin indisini alıyoruz int i = 2 * ebeveyn + 2; // indis öbek içindeyse indisi gönderiyoruz return (i < obek.size()) ? i : -1; }
int sol(int ebeveyn);
1 2 3 4 5 6 7 8
// gönderilen ebeveynin sol çocuğunu bulan ve geriye gönderen fonksiyon intObek::sol(int ebeveyn) { // sol çocuğun olması gerektiği yerin indisini alıyoruz int i = 2 * ebeveyn + 1; // indis öbek içindeyse indisi gönderiyoruz return (i < obek.size()) ? i : -1; }
int ebeveyn(int cocuk);
1 2 3 4 5 6 7 8 9 10 11 12
// gönderilen çocuğun ebeveynini bulan ve geriye gönderen fonksiyonumuz intObek::ebeveyn(int cocuk) { if (cocuk != 0) { // ebeveynin olması gerektiği yerin indisini alıyoruz int i = (cocuk - 1) / 2; return i; // ve geriye indisi gönderiyoruz } // çocuk mevcut değilse ebeveyni olmayacağı için -1 gönderiyoruz return-1; }
void yukariTasi(int indis);
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// elemanlarımızı yukarıya taşımamıza olanak sağlayan fonksiyonumuz voidObek::yukariTasi(int indis) { // indisimizdeki değer ebeveyninden küçük olduğu sürece while ((indis > 0) && (ebeveyn(indis) >= 0) && (obek[ebeveyn(indis)] > obek[indis])) { // ebeveyni ile takas işlemini gerçekleştiriyoruz int gecici = obek[ebeveyn(indis)]; obek[ebeveyn(indis)] = obek[indis]; obek[indis] = gecici; indis = ebeveyn(indis); } }
// elemanlarımızı aşağıya taşımamıza olanak sağlayan fonksiyonumuz voidObek::asagiTasi(int indis) { // yerine taşınılacak uygun çocuğu buluyoruz int cocuk = sol(indis);
if (cocuk > 0) { // uygun çocuk ile takas işlemini gerçekleştiriyoruz int gecici = obek[indis]; obek[indis] = obek[cocuk]; obek[cocuk] = gecici; asagiTasi(cocuk); } }
Ve son olarak test senaryomuzu içeren int main() fonksiyonumuz;
// gönderdiğimiz veriyi öbeğe eleman olarak ekleyen fonksiyonumuz voidObek::ekle(int veri) { obek.push_back(veri); // vektörümüzün sonuna elemanımızı ekliyoruz ve yukariTasi(obek.size() - 1); // son eklenen elemanı yukarıda uygun yere taşıyoruz }
// öbeğimizi baştan sona yazdiran fonksiyonumuz voidObek::yazdir() { vector<int>::iterator yer = obek.begin(); cout << "Öbek: ";
// vektörü başından sonuna kadar dolaşıp sırayla yazdırıyoruz while (yer != obek.end()) { cout << *yer << " "; ++yer; }
cout << endl; }
// gönderilen ebeveynin sağ çocuğunu bulan ve geriye gönderen fonksiyonumuz intObek::sag(int ebeveyn) { int i = 2 * ebeveyn + 2; // sağ çocuğun olması gerektiği yerin indisini alıyoruz return (i < obek.size()) ? i : -1; // indis öbek içindeyse indisi gönderiyoruz }
// gönderilen ebeveynin sol çocuğunu bulan ve geriye gönderen fonksiyonumuz intObek::sol(int ebeveyn) { int i = 2 * ebeveyn + 1; // sol çocuğun olması gerektiği yerin indisini alıyoruz return (i < obek.size()) ? i : -1; // indis öbek içindeyse indisi gönderiyoruz }
// gönderilen çocuğun ebeveynini bulan ve geriye gönderen fonksiyonumuz intObek::ebeveyn(int cocuk) { if (cocuk != 0) { int i = (cocuk - 1) / 2; // ebeveynin olması gerektiği yerin indisini alıyoruz return i; // ve geriye indisi gönderiyoruz } return-1; // çocuk mevcut değilse ebeveyni olmayacağı için -1 gönderiyoruz }
// elemanlarımızı yukarıya taşımamıza olanak sağlayan fonksiyonumuz voidObek::yukariTasi(int indis) { // indisimizdeki değer ebeveyninden küçük olduğu sürece while ((indis > 0) && (ebeveyn(indis) >= 0) && (obek[ebeveyn(indis)] > obek[indis])) { // ebeveyni ile takas işlemini gerçekleştiriyoruz int gecici = obek[ebeveyn(indis)]; obek[ebeveyn(indis)] = obek[indis]; obek[indis] = gecici; indis = ebeveyn(indis); } }
// elemanlarımızı aşağıya taşımamıza olanak sağlayan fonksiyonumuz voidObek::asagiTasi(int indis) { // yerine taşınılacak uygun çocuğu buluyoruz int cocuk = sol(indis);
if (cocuk > 0) { // uygun çocuk ile takas işlemini gerçekleştiriyoruz int gecici = obek[indis]; obek[indis] = obek[cocuk]; obek[cocuk] = gecici; asagiTasi(cocuk); } }