Selection Sort
Son güncelleme
Selection sort diziyi solda sıralı bir bölge ve sağda sırasız bir bölge olarak ikiye ayırır. Her geçişte sırasız bölgeyi tarayarak en küçük elemanı bulur, ardından onu ilk sırasız konuma takas eder ve sıralı bölgeyi bir artırır. Tarama ve takası izlemek için yukarıdan oynat'a basın veya karşılaştırma karşılaştırma ilerleyin.
Selection sort girdiden bağımsız olarak her zaman aynı sayıda karşılaştırma yapar, ancak en fazla n-1 takas gerçekleştirir - bubble sort'tan çok daha az - ki bu yazmalar pahalı olduğunda önem taşır.
Zaman ve alan karmaşıklığı
| Durum | Karmaşıklık | Notlar |
|---|---|---|
| En iyi durum | O(n²) | Dizi sıralı olsa bile karşılaştırmalar yapılır |
| Ortalama durum | O(n²) | Rastgele sıra |
| En kötü durum | O(n²) | Ters sıralı |
| Alan | O(1) | Yerinde |
| Kararlı | Hayır | Takaslar eşit elemanların sırasını değiştirebilir |
Adım adım
| Adım | Ne olur |
|---|---|
| 1 | Tüm diziyi sırasız olarak kabul et. |
| 2 | Minimum elemanı bulmak için sırasız bölgeyi tara. |
| 3 | Bu minimumu ilk sırasız konuma takas et. |
| 4 | Sınırı bir adım sağa taşı (o konum artık sıralı). |
| 5 | Yalnızca bir eleman sırasız kalana kadar tekrarla. |
Çözümlü örnek
[5, 2, 4, 1] sıralanıyor:
| Geçiş | Dizi | İşlem |
|---|---|---|
| Başlangıç | [5, 2, 4, 1] | Tüm dizi sırasız. |
| 1 | [1, 2, 4, 5] | [5, 2, 4, 1] taranır, minimum indeks 3'teki 1; indeks 0 ile takas edilir. |
| 2 | [1, 2, 4, 5] | [2, 4, 5] taranır, minimum zaten indeks 1'deki 2; kendisiyle takas edilir. |
| 3 | [1, 2, 4, 5] | [4, 5] taranır, minimum zaten indeks 2'deki 4; hareket gerekmez. |
| Bitti | [1, 2, 4, 5] | Geriye yalnızca 5 kaldı, yani zaten yerinde. |
Selection sort ne zaman kullanılır
| Şu durumda kullan | Şu durumda kaçın |
|---|---|
Yazmalar pahalıysa - en fazla n-1 takas yapar. | Dizi büyükse - O(n²) karşılaştırmalar baskındır. |
| Basit, kolay uygulanan yerinde bir sıralamaya ihtiyacın varsa. | Eşit anahtarların sırasını koruyan kararlı bir sıralamaya ihtiyacın varsa. |
Bellek kısıtlıysa - yalnızca O(1) ek alan kullanır. | Veri neredeyse sıralıysa - insertion sort gibi erken bitiremez. |
| Veri kümesi çok küçükse ve öngörülebilir performans önemliyse. | İşlem hacmi önemliyse - quicksort gibi O(n log n) sıralamalar çok daha hızlıdır. |
Selection Sort kodu
Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Selection Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.
Python ile Selection Sort kodu
1def selection_sort(a):2 n = len(a)3 for i in range(n - 1):4 # Find the smallest element in the unsorted tail5 min_idx = i6 for j in range(i + 1, n):7 if a[j] < a[min_idx]:8 min_idx = j9 a[i], a[min_idx] = a[min_idx], a[i]10 return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)JavaScript ile Selection Sort kodu
1function selectionSort(a) {2 for (let i = 0; i < a.length - 1; i++) {3 let min = i;4 // Find the smallest element in the unsorted tail5 for (let j = i + 1; j < a.length; j++) {6 if (a[j] < a[min]) min = j;7 }8 if (min !== i) [a[i], a[min]] = [a[min], a[i]];9 }10 return a;11}12
13const data = [5, 2, 9, 1, 7, 3];14console.log("Before:", data);15console.log("Sorted:", selectionSort([...data]));Java ile Selection Sort kodu
1import java.util.Arrays;2
3public class Main {4 static void selectionSort(int[] arr) {5 for (int i = 0; i < arr.length - 1; i++) {6 int minIndex = i;7 // Find the smallest value in the unsorted part8 for (int j = i + 1; j < arr.length; j++) {9 if (arr[j] < arr[minIndex]) minIndex = j;10 }11 int tmp = arr[i];12 arr[i] = arr[minIndex];13 arr[minIndex] = tmp;14 }15 }16
17 public static void main(String[] args) {18 int[] arr = {29, 10, 14, 37, 13, 5};19 System.out.println("Before: " + Arrays.toString(arr));20 selectionSort(arr);21 System.out.println("After: " + Arrays.toString(arr));22 }23}C++ ile Selection Sort kodu
1#include <iostream>2#include <utility>3#include <vector>4
5void printVec(const std::vector<int>& a) {6 for (int x : a) std::cout << x << " ";7 std::cout << "\n";8}9
10void selectionSort(std::vector<int>& a) {11 for (size_t i = 0; i + 1 < a.size(); ++i) {12 // Find the smallest element in the unsorted suffix13 size_t minIdx = i;14 for (size_t j = i + 1; j < a.size(); ++j) {15 if (a[j] < a[minIdx]) minIdx = j;16 }17 std::swap(a[i], a[minIdx]);18 }19}20
21int main() {22 std::vector<int> data = {29, 10, 14, 37, 13, 5};23 std::cout << "Before: ";24 printVec(data);25 selectionSort(data);26 std::cout << "After: ";27 printVec(data);28 return 0;29}C ile Selection Sort kodu
1#include <stdio.h>2
3void printArr(const int a[], int n) {4 for (int i = 0; i < n; i++) printf("%d ", a[i]);5 printf("\n");6}7
8void selectionSort(int a[], int n) {9 for (int i = 0; i < n - 1; i++) {10 // Find the smallest element in the unsorted suffix11 int minIdx = i;12 for (int j = i + 1; j < n; j++) {13 if (a[j] < a[minIdx]) minIdx = j;14 }15 int tmp = a[i];16 a[i] = a[minIdx];17 a[minIdx] = tmp;18 }19}20
21int main(void) {22 int data[] = {29, 10, 14, 37, 13, 5};23 int n = sizeof(data) / sizeof(data[0]);24 printf("Before: ");25 printArr(data, n);26 selectionSort(data, n);27 printf("After: ");28 printArr(data, n);29 return 0;30}Selection Sort SSS
Selection sort'un zaman karmaşıklığı nedir?
O(n²)'dir, çünkü her minimumu bulmak için sırasız bölgenin tamamını her zaman tarar. O(1) ek alan kullanır.Selection sort kararlı mıdır?
Selection sort ne zaman yararlıdır?
n-1 takas gerçekleştirir - eleman taşıyan bir karşılaştırmalı sıralama için mümkün olan en az sayı.Selection sort ile bubble sort arasındaki fark nedir?
O(n²) karşılaştırmalı sıralamadır, ancak selection sort en fazla n-1 takas yaparken bubble sort O(n²)'ye kadar takas yapabilir. Bubble sort ayrıca zaten sıralı bir diziyi algılayıp erken durabilir, oysa selection sort her zaman tüm geçişleri çalıştırır.Selection sort mu yoksa insertion sort mu kullanmalıyım?
O(n) çalışır ve ortalamada daha hızlıdır. Selection sort'u yalnızca yazma sayısını en aza indirmek öncelikliyse seç, çünkü en fazla n-1 takası garanti eder.Selection sort neden sıralı bir dizide bile her zaman O(n²)'de çalışır?
O(n²)'de en kötü duruma eşittir - erken kesilebilen insertion veya bubble sort'un aksine.