Selection Sort algoritması diğer sıralam algoritmalarına göre genellikle daha kolay anlaşılır ve yazılır. Çünkü temel olarak fazlasıyla basit; tüm listeyi dolaşıp en küçük elemanı başa alıyorsunuz, sonra o eleman dışındaki listeyi dolaşıp en küçük elemanı tekrar başa alıyorsunuz ve liste bitene kadar buna devam ediyorsunuz. Python da "liste[2:]" şeklinde olan kullanımın listenin 2.elemanı ile başlayıp sonuna kadar giden alt liste demek olduğunu hatırlatayım. Tabii ki bu işlemi en büyük elemanı sağa yani en sona alıp, tüm listeyi dolaşıp aynı işleme devam ederek de yapabilirsiniz. İşlemlerle daha rahatça oynamanız için fonksiyon en küçük sayıyı bulduğunda kendi listesinin ilk elemanıyla bunu değiştirdiği anda çalışması gereken yer değiştirme işlemini de ayrı bir fonksiyon olarak yazıyorum, ayrıca python yazarkenki ilk kurallardan birini unutmayın; ifadeler satır başı boşluklarına göre çalışır:
def yerDegistirme(liste, eskiEleman, yeniEleman):
transporter = liste[eskiEleman]
liste[eskiEleman] = liste[yeniEleman]
liste[yeniEleman] = transporter
def selectionSort(liste):
for i in range(len(liste)):
enKucuk = min(liste[i:])
enKucukEleman = liste[i:].index(enKucuk)
yerDegistirme(liste,i,i + enKucukEleman)
rakamlarListe = [9,3,7,4,8,0,2,5,1,6]
selectionSort(rakamlarListe)
print(rakamlarListe)
yerDegistirme fonksiyonu sırasında kullandığım eski yeni tabiri teknik olarak yer değiştirme yaptığımız için kesinlikle göreceli bir kavram. Ancak taşıyıcı (: yani transporter a attığım ilk sayıyı ifade etmek için birine eski dedim. Bu yer değiştirme fonksiyonunu ana selectionSort fonksiyonundan çağırırken görüdüğü üzere Eleman diye adlandırdığım öğeler, sayıların listedeki konumunu belirtmek için oradalar. Yani yerDegistirme çağrısının yapıldığı parantezdeki "i" ve "i+enKucukEleman", i sırasında bulunan sayı ile i den şu kadar uzaklıktaki sayının listedeki konumunu değiştir demek oluyor.
Eğer büyüken küçüğe sıralama yapmak isterseniz, min olan fonksiyonu max yapmanız yeterli. Önceki paragrafta söylediğim gibi yine küçükten büyüğe giden ama büyükleri sona koyarak ilerleyen bir fonksiyon istiyorsanız, sadece onu değil arta kalan listenin işlemlerini de değiştirmeniz gerekiyor.
Dediğim gibi diğer algoritmalara göre biraz basit, bununla birlikte de çoğu büyük liste için hiç kullanışlı bir algoritma değil Selection Sort. Çünkü görebileceğiniz üzere, ne olursa olsun tüm listeyi, azalan listeler olsa da sürekli halde dolaşmak zorunda. Bu da (n-1)+(n-2)+(n-3)+...+(1) diye giderek 0(n^2) zamanda tamamlanan bir işlem ortaya çıkartıyor.