This project has been created as part of the 42 curriculum by yuscengi, yukasaca
Bu proje, push_swap olarak adlandırılan bir algoritma uygulamasıdır. Hedef, iki yığın (stack A ve B) kullanarak verilen bir dizi sayıyı artan sırada sıralamaktır. Proje, sınırlı sayıda işlem (swap, push, rotate, reverse rotate) kullanarak en az adımda sıralama yapmayı amaçlar. Program, yığının boyutuna ve karışıklık derecesine göre farklı algoritmalar seçer: basit sıralama (küçük yığınlar için), orta sıralama (chunk tabanlı) ve karmaşık sıralama (radix sort benzeri). Kısa bir genel bakış: Kullanıcı argüman olarak sayıları verir, program işlemleri stdout'a yazar ve benchmark modu ile performans analiz eder.
Projeyi derlemek için aşağıdaki komutu çalıştırın:
make
Bu, push_swap executable'ını ve gerekli libft kütüphanesini oluşturacaktır.
Programı çalıştırmak için:
./push_swap [seçenekler] [sayılar]
Seçenekler:
--simple: Basit sıralama algoritmasını kullanır (küçük yığınlar için, O(n²)).--medium: Orta sıralama algoritmasını kullanır (chunk tabanlı, O(n√n)).--complex: Karmaşık sıralama algoritmasını kullanır (radix sort, O(n log n)).--adaptive: Karışıklık derecesine göre otomatik algoritma seçimi.--bench: Benchmark modu, işlem sayılarını ve raporları stderr'e yazar.
Örnekler:
./push_swap 3 1 4 1 5
./push_swap --bench --adaptive 10 9 8 7 6 5 4 3 2 1
Projede kullanılan libft kütüphanesi otomatik olarak derlenir. Ek bağımlılık yoktur. Program, verilen sayıların geçerli tamsayılar olmasını ve tekrar etmemesini bekler; aksi halde "Error" mesajı verir.
- Sorting Algorithms: Genel sıralama algoritmaları hakkında bilgi (insertion sort, radix sort vb.).
- Stack Veri Yapısı: Yığın veri yapısı açıklaması.
- Chunk Sorting: Chunk tabanlı sıralama teknikleri.
- Gemini.
- Öğreticiler: YouTube'da push_swap algoritmaları üzerine çeşitli videolar ve 42 öğrencilerinin paylaşımları mevcuttur.
Bu projede AI, kod yazımında yardımcı oldu. Özellikle, algoritma tasarlama (örneğin, disorder hesaplama ve adaptive seçim), hata ayıklama ve kod optimizasyonu aşamalarında öneriler sağladı. Benchmark modu ve raporlama özelliği için de AI fikir verdi. Ana kod yapısı manuel olarak geliştirildi, ancak AI README.md'nin hazırlanmasında ve dokümantasyonunda kullanıldı.
- Çoklu Algoritmalar: Basit (3'e kadar eleman), orta (chunk tabanlı) ve karmaşık (bit sıralaması) algoritmalar.
- Adaptive Mod: Yığının karışıklık derecesine (%0-100) göre otomatik algoritma seçimi.
- Benchmark Modu: İşlem sayılarını sayar, toplamı ve her işlem türünü raporlar (sa, sb, pa vb.).
- Hata Yönetimi: Geçersiz girişler için "Error" mesajı ve temiz çıkış.
- Libft Entegrasyonu: Özel string parsing, liste işlemleri ve utility fonksiyonları için.
- Performans Analizi: Disorder metriği ile yığının ne kadar karışık olduğunu hesaplar.
- Basit sıralama:
./push_swap --simple 2 1 3 - Orta sıralama:
./push_swap --medium 5 4 3 2 1 6 7 8 - Karmaşık sıralama:
./push_swap --complex 100 rastgele sayılar - Adaptive:
./push_swap --adaptive 10 9 8 7 6 5 4 3 2 1(karışıklığa göre seçer) - Benchmark:
./push_swap --bench --adaptive 3 1 4 1 5(rapor stderr'e yazılır)
- Dil: C, performans ve düşük seviye kontrol için.
- Veri Yapısı: Çift yönlü bağlı liste (t_stack), yığın işlemleri için optimize edilmiş.
- Kütüphane: Libft (özel ft_split, ft_atol vb. için), standart dışı fonksiyonlar için.
- Algoritmalar:
- Basit: Selection sort benzeri, min elemanı bulup push.
- Orta: Chunk'lara bölme (16'ya bölerek +12), rotate ile pozisyonlama.
- Karmaşık: Radix sort, bit bit sıralama.
- Benchmark: Singleton pattern ile global bench struct, işlem sayımı için.
- Disorder: İnverson sayısı / toplam çiftler, karışıklık metriği (0: sıralı, 1: ters sıralı).