Sıralama: kabarcık ve seçmeli
Komşuları karşılaştırıp yer değiştir; ya da her turda en küçüğü seçip öne al.
Sıralama, algoritmaların klasik problemidir. İki basit yöntem:
Kabarcık (bubble) sıralama
Yan yana iki elemana bak; soldaki büyükse takas et. Bir turda en büyük eleman sona "kabarır". Tur sayısı kadar tekrarla. Basit ama yavaş: n elemanda yaklaşık n² karşılaştırma.
Seçmeli (selection) sıralama
Listenin geri kalanındaki en küçüğü bul, ilk boş yere koy. Sonra ikinci en küçüğü… "En büyüğü bul" kalıbını arka arkaya uygulamaktan başka bir şey değil.
Hangisi?
İkisi de küçük listeler ve öğrenmek için iyi. Gerçek programlarda hazır Array.Sort kullanılır — ama neyi çağırdığını bilmek için bir kez elle yapmalısın.
flowchart TD
A[tur = 0] --> B{tur #lt; n-1 ?}
B -- Evet --> C[i = 0]
C --> D{i #lt; n-1-tur ?}
D -- Evet --> E{d#91;i#93; #gt; d#91;i+1#93; ?}
E -- Evet --> F[takas et]
E -- Hayır --> G[i = i + 1]
F --> G
G --> D
D -- Hayır --> H[tur = tur + 1]
H --> B
B -- Hayır --> I([Sıralı])1tur ← 02İKEN tur < n − 13 i ← 04 İKEN i < n − 1 − tur5 EĞER d[i] > d[i+1] İSE d[i] ile d[i+1] takas6 i ← i + 17 DÖNGÜ SONU8 tur ← tur + 19DÖNGÜ SONU
1int[] d = { 5, 1, 4, 2 };2for (int tur = 0; tur < d.Length - 1; tur++)3{4 for (int i = 0; i < d.Length - 1 - tur; i++)5 {6 if (d[i] > d[i + 1])7 {8 int g = d[i]; d[i] = d[i + 1]; d[i + 1] = g;9 }10 }11}12Console.WriteLine(string.Join(" ", d));
Kutuların her adımdaki değeri. Kağıtta izleme tablosu tutarken tam bunu yaparsın.
| # | satır | dizi | not |
|---|---|---|---|
| 1 | tur 0: 5>1 takas, 5>4 takas, 5>2 takas | 1 4 2 5 | En büyük (5) sona kabardı |
| 2 | tur 1: 1>4 hayır, 4>2 takas | 1 2 4 5 | 4 yerine oturdu |
| 3 | tur 2: 1>2 hayır | 1 2 4 5 | Sıralı |
[7, 3, 9, 1] dizisini önce kabarcık, sonra seçmeli sıralama ile elle sırala; her turdan sonra diziyi yaz. Kaç takas yaptın? Hangi yöntem daha az takas yapıyor?