Giriş
Algoritmalar, yazılım geliştirmede temel bir rol oynar ve programlama dillerinin etkin kullanımını sağlar. JavaScript, web geliştirme dünyasında yaygın olarak kullanılan bir dil olduğundan, bu yazıda JavaScript ile gerçekleştirilen 10 harika algoritma örneğini ve açıklamalarını ele alacağız. Bu örnekler, temel algoritma mantığını anlamanıza yardımcı olacak ve JavaScript becerilerinizi geliştirecektir. Ayrıca, her algoritmanın detaylı açıklamalarını ve kullanım alanlarını da ele alarak, bu bilgileri nasıl uygulayabileceğinizi göstereceğiz.
İçindekiler
En Küçük ve En Büyük Sayıyı Bulma
Algoritmanın Amacı ve Kullanım Alanları
Bir dizideki en küçük ve en büyük sayıyı bulmak, veri analizi ve istatistiksel işlemler için sıkça gereklidir. Örneğin, bir öğrencinin notlarını içeren bir dizide en yüksek ve en düşük notu belirlemek için bu algoritma kullanılabilir.
Algoritmanın Açıklaması
Bu algoritma, verilen bir dizideki tüm elemanları döngü ile kontrol ederek en küçük ve en büyük değeri bulur.
function findMinMax(arr) {
let min = arr[0];
let max = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
if (arr[i] > max) {
max = arr[i];
}
}
return { min, max };
}
const numbers = [3, 5, 7, 2, 8, -1, 4, 10, 12];
const result = findMinMax(numbers);
console.log(`Min: ${result.min}, Max: ${result.max}`);
Algoritmanın İşleyişi
- İlk olarak, dizinin ilk elemanı en küçük ve en büyük değer olarak kabul edilir.
- Döngü ile dizinin her elemanı kontrol edilir.
- Eğer bir eleman mevcut en küçük değerden küçükse, bu eleman yeni en küçük değer olarak atanır.
- Eğer bir eleman mevcut en büyük değerden büyükse, bu eleman yeni en büyük değer olarak atanır.
- Döngü tamamlandığında, en küçük ve en büyük değerler döndürülür.
Bu algoritma O(n) zaman karmaşıklığına sahiptir, bu da algoritmanın dizinin her elemanını sadece bir kez kontrol ettiği anlamına gelir.
Fibonacci Dizisi
Algoritmanın Amacı ve Kullanım Alanları
Fibonacci dizisi, doğada ve matematikte sıkça karşımıza çıkan bir dizidir. Bu dizinin elemanları, genellikle algoritmaların ve yazılım programlarının performansını test etmek için kullanılır. Ayrıca, bilgisayar grafiklerinde ve biyoinformatikte de kullanılabilir.
Algoritmanın Açıklaması
Bu algoritma, Fibonacci dizisini belirli bir sayıya kadar hesaplar.
function fibonacci(num) {
let n1 = 0, n2 = 1, nextTerm;
let fiboSeries = [n1, n2];
for (let i = 1; i < num; i++) {
nextTerm = n1 + n2;
fiboSeries.push(nextTerm);
n1 = n2;
n2 = nextTerm;
}
return fiboSeries;
}
console.log(fibonacci(10));
Algoritmanın İşleyişi
- İlk iki Fibonacci sayısı (0 ve 1) başlangıç olarak alınır.
- Döngü ile belirlenen sayı kadar Fibonacci sayısı hesaplanır.
- Her adımda, yeni Fibonacci sayısı önceki iki sayının toplamı olarak hesaplanır ve diziye eklenir.
- Hesaplanan Fibonacci dizisi döndürülür.
Bu algoritma O(n) zaman karmaşıklığına sahiptir ve basit bir döngü ile çalışır.
Palindrom Kontrolü
Algoritmanın Amacı ve Kullanım Alanları
Palindrom kontrolü, bir kelimenin veya cümlenin tersten okunduğunda da aynı olup olmadığını belirlemek için kullanılır. Bu algoritma, metin işleme, dil işleme ve siber güvenlikte kullanılabilir.
Algoritmanın Açıklaması
Bu algoritma, bir kelimenin palindrom olup olmadığını kontrol eder.
function isPalindrome(str) {
const cleanedStr = str.replace(/[^A-Z0-9]/ig, "").toLowerCase();
const reversedStr = cleanedStr.split('').reverse().join('');
return cleanedStr === reversedStr;
}
console.log(isPalindrome("A man, a plan, a canal, Panama"));
Algoritmanın İşleyişi
- Girdi metni, harf ve sayılar dışında tüm karakterlerden arındırılır ve küçük harfe dönüştürülür.
- Metin tersine çevrilir ve orijinal metinle karşılaştırılır.
- Eğer tersine çevrilmiş metin orijinali ile aynıysa, metin palindromdur.
Bu algoritma O(n) zaman karmaşıklığına sahiptir, çünkü metnin her karakteri bir kez işlenir.
Faktöriyel Hesaplama
Algoritmanın Amacı ve Kullanım Alanları
Faktöriyel hesaplama, kombinatorik ve olasılık teorisinde sıkça kullanılır. Ayrıca, algoritmaların performansını test etmek ve matematiksel problemleri çözmek için de kullanılır.
Algoritmanın Açıklaması
Bu algoritma, bir sayının faktöriyelini hesaplar.
function factorial(n) {
if (n === 0 || n === 1) {
return 1;
}
return n * factorial(n - 1);
}
console.log(factorial(5));
Algoritmanın İşleyişi
- Eğer sayı 0 veya 1 ise, faktöriyel 1 olarak döndürülür.
- Aksi takdirde, sayı kendisinden bir küçük sayının faktöriyeli ile çarpılır.
- Bu işlem, sayı 1 olana kadar tekrarlanır.
Bu algoritma O(n) zaman karmaşıklığına sahiptir ve rekürsif olarak çalışır.
Asal Sayı Kontrolü
Algoritmanın Amacı ve Kullanım Alanları
Asal sayı kontrolü, matematiksel analizlerde ve kriptografide kullanılır. Asal sayılar, sadece kendisi ve 1 ile bölünebilen sayılardır ve bu özellikleri ile çeşitli güvenlik algoritmalarında önemli bir rol oynar.
Algoritmanın Açıklaması
Bu algoritma, bir sayının asal olup olmadığını kontrol eder.
function isPrime(num) {
if (num <= 1) return false;
if (num <= 3) return true;
if (num % 2 === 0 || num % 3 === 0) return false;
for (let i = 5; i * i <= num; i += 6) {
if (num % i === 0 || num % (i + 2) === 0) return false;
}
return true;
}
console.log(isPrime(29));
Algoritmanın İşleyişi
- Eğer sayı 1’den küçükse veya eşitse, asal değildir.
- Eğer sayı 2 veya 3 ise, asal sayıdır.
- Eğer sayı 2 veya 3’e bölünebiliyorsa, asal değildir.
- 5’ten başlayarak sayının kareköküne kadar olan sayılar arasında 6’nın katları kontrol edilir.
- Eğer sayı bu sayılardan herhangi birine bölünebiliyorsa, asal değildir.
- Hiçbir koşulda bölünme gerçekleşmiyorsa, sayı asal sayıdır.
Bu algoritma O(√n) zaman karmaşıklığına sahiptir.
Dizi Elemanlarını Tersine Çevirme
Algoritmanın Amacı ve Kullanım Alanları
Bir dizinin elemanlarını tersine çevirmek, veri yapılarında ve algoritmalarda sıkça kullanılan bir işlemdir. Örneğin, bir yığın (stack) yapısında elemanların sırasını tersine çevirmek için kullanılabilir.
Algoritmanın Açıklaması
Bu algoritma, bir dizinin elemanlarını tersine çevirir.
function reverseArray(arr) {
let left = 0;
let right = arr.length - 1;
while (left < right) {
[arr[left], arr[right]] = [arr[right], arr[left]];
left++;
right--;
}
return arr;
}
console.log(reverseArray([1, 2, 3, 4, 5]));
Algoritmanın İşleyişi
- Dizinin başından ve sonundan başlayarak iki gösterge (pointer) oluşturulur.
- Gösterge elemanları karşılıklı olarak yer değiştirir.
- Gösterge elemanları ortada buluşana kadar işlem tekrarlanır.
Bu algoritma O(n) zaman karmaşıklığına sahiptir.
Merge Sort Algoritması
Algoritmanın Amacı ve Kullanım Alanları
Merge Sort, verileri sıralamak için kullanılan etkili bir algoritmadır. Ayrık ve fethet (divide and conquer) yöntemine dayalıdır ve büyük veri kümelerini sıralamak için idealdir.
Algoritmanın Açıklaması
Bu algoritma, bir diziyi Merge Sort kullanarak sıralar.
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const mid = Math.floor(arr.length / 2);
const left = arr.slice(0, mid);
const right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
let resultArray = [], leftIndex = 0, rightIndex = 0;
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
resultArray.push(left[leftIndex]);
leftIndex++;
} else {
resultArray.push(right[rightIndex]);
rightIndex++;
}
}
return resultArray
.concat(left.slice(leftIndex))
.concat(right.slice(rightIndex));
}
console.log(mergeSort([34, 7, 23, 32, 5, 62]));
Algoritmanın İşleyişi
- Dizi, ortasından ikiye bölünür.
- Her iki yarı, ayrı ayrı Merge Sort ile sıralanır.
- İki sıralı dizi, birleştirilerek tek bir sıralı dizi elde edilir.
Bu algoritma O(n log n) zaman karmaşıklığına sahiptir.
Binary Search Algoritması
Algoritmanın Amacı ve Kullanım Alanları
Binary Search, sıralı bir dizide belirli bir öğeyi bulmak için kullanılır. Bu algoritma, büyük veri kümelerinde hızlı arama yapma imkanı sağlar ve veritabanı sorgularında, indeksleme işlemlerinde kullanılır.
Algoritmanın Açıklaması
Bu algoritma, sıralı bir dizide ikili arama (binary search) yapar.
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
const sortedArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(binarySearch(sortedArray, 4));
Algoritmanın İşleyişi
- Dizinin ortasında bir eleman seçilir.
- Hedef eleman ortadaki elemandan küçükse, sol yarıda arama yapılır.
- Hedef eleman ortadaki elemandan büyükse, sağ yarıda arama yapılır.
- İşlem, hedef eleman bulunana veya arama alanı boşalana kadar tekrarlanır.
Bu algoritma O(log n) zaman karmaşıklığına sahiptir.
Dizi İçindeki En Büyük İkinci Elemanı Bulma
Algoritmanın Amacı ve Kullanım Alanları
Bir dizideki en büyük ikinci elemanı bulmak, veri analizlerinde ve optimizasyon problemlerinde kullanılabilir. Örneğin, bir yarışmada ikinci en yüksek puanı alan kişiyi belirlemek için kullanılabilir.
Algoritmanın Açıklaması
Bu algoritma, bir dizideki en büyük ikinci elemanı bulur.
function findSecondLargest(arr) {
let first = -Infinity, second = -Infinity;
for (let i = 0; i < arr.length; i++) {
if (arr[i] > first) {
second = first;
first = arr[i];
} else if (arr[i] > second && arr[i] !== first) {
second = arr[i];
}
}
return second;
}
console.log(findSecondLargest([3, 5, 7, 2, 8, -1, 4, 10, 12]));
Algoritmanın İşleyişi
- Dizideki en büyük ve ikinci en büyük elemanlar başlangıçta -Infinity olarak kabul edilir.
- Döngü ile dizinin her elemanı kontrol edilir.
- Eğer bir eleman mevcut en büyük değerden büyükse, bu eleman en büyük olarak atanır ve önceki en büyük değer ikinci en büyük olarak kaydedilir.
- Eğer bir eleman ikinci en büyük değerden büyükse ve en büyük değere eşit değilse, bu eleman ikinci en büyük olarak atanır.
Bu algoritma O(n) zaman karmaşıklığına sahiptir.
Anagram Kontrolü
Algoritmanın Amacı ve Kullanım Alanları
Anagram kontrolü, metin işleme ve dil işleme uygulamalarında kullanılır. İki kelimenin veya cümlenin aynı harflerle farklı sıralamalarda olup olmadığını belirlemek için kullanılır.
Algoritmanın Açıklaması
Bu algoritma, iki kelimenin anagram olup olmadığını kontrol eder.
function areAnagrams(str1, str2) {
const normalize = str => str.replace(/[^A-Z0-9]/ig, '').toLowerCase().split('').sort().join('');
return normalize(str1) === normalize(str2);
}
console.log(areAnagrams("listen", "silent"));
Algoritmanın İşleyişi
- Girdi metinler, harf ve sayılar dışında tüm karakterlerden arındırılır ve küçük harfe dönüştürülür.
- Metinler sıralanır ve karşılaştırılır.
- Eğer sıralanmış metinler aynıysa, metinler anagramdır.
Bu algoritma O(n log n) zaman karmaşıklığına sahiptir.
Sonuç
Bu yazıda, JavaScript ile gerçekleştirilen 10 harika algoritma örneğini ve açıklamalarını ele aldık. Bu algoritmalar, temel programlama becerilerinizi geliştirmenize yardımcı olacak ve JavaScript dilindeki yetkinliğinizi artıracaktır. Algoritmaların detaylarını inceleyerek, kendi projelerinizde kullanabileceğiniz güçlü çözümler geliştirebilirsiniz.
Sıkça Sorulan Sorular
JavaScript ile algoritma yazmak zor mu?
JavaScript, esnek ve öğrenmesi kolay bir dil olduğu için algoritma yazmak genellikle zor değildir. Temel programlama bilgisi ve pratikle algoritmaları kolayca yazabilirsiniz.
Algoritmalar neden önemlidir?
Algoritmalar, yazılım geliştirmede problemleri çözmek için kullanılır. Verimliliği artırır, performansı optimize eder ve karmaşık işlemleri basitleştirir.
Merge Sort nedir?
Merge Sort, verileri sıralamak için kullanılan bir ayrık ve fethet algoritmasıdır. Diziyi ikiye böler, her iki yarıyı da ayrı ayrı sıralar ve sonra birleştirir.
Binary Search nasıl çalışır?
Binary Search, sıralı bir dizide belirli bir öğeyi bulmak için kullanılan bir arama algoritmasıdır. Diziyi yarıya böler ve hedef öğeyi arar. Hedef öğe, orta öğeden küçükse sol yarıda, büyükse sağ yarıda aranır.
Anagram nedir?
Anagram, bir kelimenin harflerinin yer değiştirilmesiyle başka bir kelime oluşturulmasıdır. Örneğin, “listen” ve “silent” kelimeleri anagramdır.
JavaScript’te en verimli sıralama algoritması hangisidir?
JavaScript’te en verimli sıralama algoritması genellikle Merge Sort veya Quick Sort olarak kabul edilir. Her ikisi de büyük veri kümelerinde iyi performans gösterir.