Seçmeli sıralama

**Seçmeli Sıralama**, bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Karmaşıklığı <math>\mathcal{O}(n^2)</math> olduğu için büyük listeler üzerinde kullanıldığında verim sağlamaz ve genel olarak benzeri olan eklemeli sıralamadan daha başarısızdır. Seçmeli sıralama yalın olduğu ve bazı durumlarda daha karmaşık olan algoritmalardan daha iyi sonuç verdiği için tercih edilebilir.

## Yöntem
Algoritma aşağıdaki gibi çalışır:
# Listedeki en küçük değerli öğeyi bul.
# İlk konumdaki öğeyle bulunan en küçük değerli öğenin yerini değiştir.
# Yukarıdaki adımları listenin ilk elemanından sonrası için (ikinci elemandan başlayarak) yinele.

### Sözde Kodu
**A** sıralanacak öğeler kümesi, **n** ise **A**'daki öğe sayısıdır. Dizi 0 numaralı dizinle başlamaktadır.


```pascal
for i ← 0 to n-2 do
    min ← i
    for j ← (i + 1) to n-1 do
        if A[j] < A[min]
            min ← j
    swap A[i] and A[min]
```


## Seçmeli Sıralama Algoritmasının Örnek Kodu

```c#
int enkucuk, yedek;
for (int i = 0; i < dizi.Length-1; i++)
{
    enkucuk = i;
    for (int j = i+1; j < dizi.Length; j++)
    {
        if (dizi[j]<dizi[enkucuk])
        {
            enkucuk = j;
        }
    }

    if (enkucuk != i)
    {
        yedek = dizi[i];
        dizi[i] = dizi[enkucuk];
        dizi[enkucuk] = yedek;
    }               
}
```



```c
public int[] secmeliSiralama(int[] dizi)
{
    int enkucuk, yedek;
    for (int i = 0; i < dizi.Length - 1; i++)
    {
         enkucuk = i;
         for (int j = i + 1; j < dizi.Length; j++)
             if (dizi[j] < dizi[enkucuk])
                 enkucuk = j;
         if (enkucuk != i)
         {
             yedek = dizi[i];
             dizi[i] = dizi[enkucuk];
             dizi[enkucuk] = yedek;
         }
     }
     return dizi;
}
```


## Karmaşıklık Hesabı
Seçmeli sıralama algoritmasının zaman karmaşıklığı hesaplanırken, yapılan karşılaştırmalar ve yer değiştirmeler dikkate alınır. Seçmeli sıralama algoritması n elemanlı bir listede, en küçük eleman için n-1 tane karşılaştırma yapar, ikinci en küçük eleman için n-2 tane karşılaştırma yapar, diğer elemanlar için karşılaştırma sayısı n-3, n-4, ..., 2, 1, 0 şeklinde azalarak devam eder. Listedeki bütün elemanlar için yapılan karşılaştırmaların toplamı

(n-1) + (n-2) + (n-3) + (n-4) + ... + 2 + 1 + 0 =  n (n-1) /2 yapar.

Her bir eleman için bir kez yer değiştirme yapılır, tüm liste için toplam n  tane yer değiştirme işlemi yapılır. Hesaplamalar sonucunda elde edilen

n + n(n-1)/2 değerlerinin asimptotik üst sınırı O(n^2)  değerini verir. Seçmeli sıralama algoritması listenin en küçük elemanının nerede olduğunu bilmediği ve her bir eleman için tüm elemanlarla karşılaştırma yaptığı için liste içindeki elemanların rastgele sıralanmış ya da eşit elemanlardan oluşmasını dikkate almaz, bu sebeple seçmeli sıralama algoritması her durumda O(n^2)   karmaşıklığıyla çalışır.

## Diğer Sıralama Algoritmaları
* Hızlı Sıralama
* Birleştirmeli Sıralama
* Kabarcık Sıralaması
* Kokteyl Sıralaması
* Tarak Sıralaması

## Kaynakça

## Dış bağlantılar
* Analyze Selection Sort in an online JavaScript IDE
* Selection Sort in C++ 
* Selection Sort Demo
* Selection Sort Demo
* Selection Sort Demonstration
* Pointers to selection sort visualizations
* C++ Program - Selection Sort 
* Selection sort explained and C++ source code
* A graphical demonstration and discussion of selection sort
* Selection sort in C