
Algoritmalar, veriyi düzenlemek ve aramak için kullandığımız temel yapı taşlarıdır. Bu rehberde "Temel Algoritmalar" başlığı altında kısa açıklamalar ve çalıştırılabilir seviyede Python/JavaScript snippet'leri ile sıralama (sorting) ve arama (searching) yöntemlerini göreceksiniz. Temel kavramlar için üniversite dersleri ve geliştirici kaynakları yol göstericidir; örneğin Marmara Üniversitesi'nin algoritma ders notları ve sektör makaleleri giriş için faydalıdır (Marmara Üniversitesi, TechCareer).
Sıralama algoritmaları, bir diziyi belirli bir düzene (ör. artan) koymak için kullanılır. En temel örnekler arasında Bubble Sort, Merge Sort ve Quick Sort bulunur. Bu yöntemlerin avantaj ve dezavantajları; çalışma zamanı (time complexity), bellek kullanımı ve kararlılık (stability) gibi ölçütlerle değerlendirilir (TechCareer, Marmara Üniversitesi).
Açıklama: En basit karşılaştırmalı sıralama algoritmasıdır; komşu elemanları karşılaştırıp gerektiğinde takas eder. Küçük veri setlerinde öğrenme amaçlı yararlıdır ancak performansı düşüktür.
Zaman karmaşıklığı: genellikle O(n^2) (ortalama ve en kötü durum). Bellek: O(1).
Python (örnek):
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
Açıklama: Böl ve yönet (divide and conquer) yaklaşımı kullanır. Diziyi ikiye böler, her parçayı sıralar ve sonra iki sıralı parçayı birleştirir. Genellikle garantili O(n log n) zaman karmaşıklığı sağlar ve stabil bir sıralama yöntemidir.
Zaman karmaşıklığı: O(n log n) hem ortalama hem de en kötü durumda. Bellek: ekstra O(n) kullanır.
Python (örnek):
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr)//2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
i = j = 0
merged = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i]); i += 1
else:
merged.append(right[j]); j += 1
merged += left[i:] + right[j:]
return merged
Açıklama: Pivot seçip diziyi pivot'a göre küçük ve büyük olarak ayırır, sonra rekürsif olarak sıralar. Ortalama durumda O(n log n) hızındadır; doğru pivot seçimine bağlı olarak performansı değişir. Tipik uygulamalarda çok hızlıdır ve yerinde uygulanan versiyonlarda ek bellek gereksinimi düşüktür.
Zaman karmaşıklığı: ortalama O(n log n), en kötü durum O(n^2) olabilir (kötü pivot seçiminde). Stabil değildir (standart uygulama).
Python (basit örnek, pivot ile ayırma):
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
Arama algoritmaları; bir dizide belirli bir öğeyi bulmak için kullanılır. En temel iki yöntem Linear Search (doğrusal arama) ve Binary Search (ikili arama)dir. Binary Search kullanabilmek için dizi önceden sıralanmış olmalıdır (TechCareer).
Açıklama: Dizideki elemanları baştan sona kontrol eder. Küçük veya sıralı olmayan veri setleri için basittir.
Zaman karmaşıklığı: O(n). Bellek: O(1).
Python:
def linear_search(arr, target):
for i, v in enumerate(arr):
if v == target:
return i
return -1
Açıklama: Sıralı bir dizide ortadaki elemanı kontrol ederek arama aralığını yarıya indirir. Bu yöntem, doğru uygulandığında çok daha hızlı sonuç verir (özellikle büyük veri setlerinde).
Zaman karmaşıklığı: O(log n). Gereksinim: aranan dizi daha önceden sıralanmış olmalıdır (aksi halde önce sıralama gerekir). Daha fazla teknik detay için referans dokümanlar ve ders notlarına bakabilirsiniz (Marmara Üniversitesi).
Iteratif Python örneği:
def binary_search(arr, target):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
lo = mid + 1
else:
hi = mid - 1
return -1
Aşağıda her iki dilde de kısa ve doğrudan çalıştırılabilecek snippet örnekleri yer alıyor. Bu snippet'ler öğrenme ve küçük uygulamalar için uygundur.
JavaScript:
function binarySearch(arr, target) {
let lo = 0, hi = arr.length - 1;
while (lo <= hi) {
const mid = Math.floor((lo + hi) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] < target) lo = mid + 1; else hi = mid - 1;
}
return -1;
}
JavaScript:
function linearSearch(arr, target) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === target) return i;
}
return -1;
}
Dizi: [2, 3, 5, 7, 11, 13], aranan: 7
Bu örnek, her adımda arama aralığının yaklaşık yarıya indirildiğini gösterir; dolayısıyla logaritmik zaman kazancı elde edilir.
Temel sıralama ve arama algoritmalarını bilmek; hangi durumda hangi yöntemi seçmeniz gerektiğini anlamanızı sağlar. Kaynak dersler ve makaleler (örneğin Marmara Üniversitesi ve TechCareer) konunun teorik temelini sunar. Buradaki snippet'ler öğrenme ve hızlı prototipleme amaçlı hazırlıdır; gerçek dünya uygulamalarında profil ve testi unutmayın.
Yorumlar