Ekleme Sıralaması
Son güncelleme
Ekleme sıralaması, sıralı diziyi her seferinde bir eleman ekleyerek oluşturur. Sıralanmamış bir sonraki elemanı ("anahtar") alır ve sıralı bölgedeki kendisinden büyük her elemanı bir yuva sağa kaydırır, ardından anahtarı boşluğa yerleştirir. Bu tam olarak çoğu insanın elindeki oyun kartlarını sıralama biçimidir. Her anahtarın nasıl eklendiğini izlemek için yukarıdan oynat'a basın veya kaydırmaları teker teker ilerleyin.
Ekleme sıralaması küçük veya neredeyse sıralı girdilerde çok hızlıdır - veriler zaten sıralıyken O(n) sürede çalışır - bu yüzden birçok hibrit sıralama küçük alt diziler için ona başvurur.
Zaman ve alan karmaşıklığı
| Durum | Karmaşıklık | Notlar |
|---|---|---|
| En iyi durum | O(n) | Zaten sıralı |
| Ortalama durum | O(n²) | Rastgele sıra |
| En kötü durum | O(n²) | Ters sıralı |
| Alan | O(1) | Yerinde |
| Kararlı | Evet | Eşit elemanlar göreli sıralarını korur |
Adım adım
| Adım | Ne olur |
|---|---|
| 1 | İlk elemanı boyutu bir olan sıralı bir bölge olarak kabul et. |
| 2 | Bir sonraki elemanı anahtar olarak al. |
| 3 | Sıralı bölgede anahtardan büyük her elemanı bir yuva sağa kaydır. |
| 4 | Anahtarı açılan boşluğa ekle. |
| 5 | Her eleman eklenene kadar tekrarla. |
Çözümlü örnek
[5, 2, 4, 1] sıralanıyor:
| Geçiş | Dizi | Eylem |
|---|---|---|
| Başlangıç | [5, 2, 4, 1] | 5, boyutu bir olan başlangıç sıralı bölgesidir. |
| 1 | [2, 5, 4, 1] | Anahtar 2: 5'i sağa kaydır, 2'yi başa ekle. |
| 2 | [2, 4, 5, 1] | Anahtar 4: 5'i sağa kaydır, 2 küçük olduğu için dur, 4'ü ekle. |
| 3 | [1, 2, 4, 5] | Anahtar 1: 5, 4, 2'yi sağa kaydır, 1'i başa ekle. |
| Bitti | [1, 2, 4, 5] | Tüm elemanlar eklendi; dizi sıralı. |
Ekleme sıralaması ne zaman kullanılır
| Şu durumda kullan | Şu durumda kaçın |
|---|---|
Dizi küçük olduğunda (yaklaşık n < 20). | Dizi büyük ve rastgele sıralı olduğunda. |
Veriler zaten neredeyse sıralı olup O(n) en iyi durumu verdiğinde. | Garantili bir O(n log n) en kötü duruma ihtiyaç duyduğunda. |
O(1) ek alanla kararlı, yerinde bir sıralamaya ihtiyaç duyduğunda. | Elemanları taşımak maliyetli olduğunda, çünkü çok sayıda kaydırma yapar. |
| Veriler artımlı olarak geldiğinde ve çevrimiçi sıralı kalması gerektiğinde. | Girdi ters sıralı olduğunda, O(n²) en kötü durumu. |
Insertion Sort kodu
Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Insertion Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.
Python ile Insertion Sort kodu
1def insertion_sort(a):2 for i in range(1, len(a)):3 key = a[i]4 j = i - 15 # Shift larger elements one slot to the right6 while j >= 0 and a[j] > key:7 a[j + 1] = a[j]8 j -= 19 a[j + 1] = key10 return a11
12
13nums = [7, 3, 9, 1, 5, 8, 2]14print("Before:", nums)15insertion_sort(nums)16print("After: ", nums)JavaScript ile Insertion Sort kodu
1function insertionSort(a) {2 for (let i = 1; i < a.length; i++) {3 const key = a[i];4 let j = i - 1;5 // Shift larger elements right to open a slot for key6 while (j >= 0 && a[j] > key) {7 a[j + 1] = a[j];8 j--;9 }10 a[j + 1] = key;11 }12 return a;13}14
15const data = [5, 2, 9, 1, 7, 3];16console.log("Before:", data);17console.log("Sorted:", insertionSort([...data]));Java ile Insertion Sort kodu
1import java.util.Arrays;2
3public class Main {4 static void insertionSort(int[] arr) {5 for (int i = 1; i < arr.length; i++) {6 int key = arr[i];7 int j = i - 1;8 // Shift larger elements one slot to the right9 while (j >= 0 && arr[j] > key) {10 arr[j + 1] = arr[j];11 j--;12 }13 arr[j + 1] = key;14 }15 }16
17 public static void main(String[] args) {18 int[] arr = {7, 3, 9, 1, 5, 8, 2};19 System.out.println("Before: " + Arrays.toString(arr));20 insertionSort(arr);21 System.out.println("After: " + Arrays.toString(arr));22 }23}C++ ile Insertion Sort kodu
1#include <iostream>2#include <vector>3
4void printVec(const std::vector<int>& a) {5 for (int x : a) std::cout << x << " ";6 std::cout << "\n";7}8
9void insertionSort(std::vector<int>& a) {10 for (size_t i = 1; i < a.size(); ++i) {11 int key = a[i];12 int j = static_cast<int>(i) - 1;13 // Shift larger elements one slot to the right14 while (j >= 0 && a[j] > key) {15 a[j + 1] = a[j];16 --j;17 }18 a[j + 1] = key;19 }20}21
22int main() {23 std::vector<int> data = {7, 3, 9, 1, 5, 8, 2};24 std::cout << "Before: ";25 printVec(data);26 insertionSort(data);27 std::cout << "After: ";28 printVec(data);29 return 0;30}C ile Insertion 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 insertionSort(int a[], int n) {9 for (int i = 1; i < n; i++) {10 int key = a[i];11 int j = i - 1;12 // Shift larger elements one slot to the right13 while (j >= 0 && a[j] > key) {14 a[j + 1] = a[j];15 j--;16 }17 a[j + 1] = key;18 }19}20
21int main(void) {22 int data[] = {7, 3, 9, 1, 5, 8, 2};23 int n = sizeof(data) / sizeof(data[0]);24 printf("Before: ");25 printArr(data, n);26 insertionSort(data, n);27 printf("After: ");28 printArr(data, n);29 return 0;30}Ekleme Sıralaması SSS
Ekleme sıralamasının zaman karmaşıklığı nedir?
O(n²), ancak zaten sıralı veya neredeyse sıralı bir dizide O(n)'dir. O(1) ek alan kullanır.Ekleme sıralaması kararlı mıdır?
Ekleme sıralamasını ne zaman kullanmalıyım?
Ekleme sıralaması ile kabarcık sıralaması arasındaki fark nedir?
O(n²) karşılaştırmalı sıralamalardır, ancak ekleme sıralaması anahtar için bir boşluk açmak amacıyla elemanları kaydırır, kabarcık sıralaması ise sırasız komşu çiftleri tekrar tekrar takas eder. Ekleme sıralaması genellikle daha az yazma yapar ve pratikte, özellikle O(n) en iyi durumuna ulaştığı neredeyse sıralı verilerde, daha iyi performans gösterir.Ekleme sıralaması küçük dizilerde neden birleştirme sıralamasından daha hızlıdır?
O(n log n) sıralamaları geçer. Timsort ve introsort gibi hibrit sıralamaların küçük alt diziler için ekleme sıralamasına geçmesinin nedeni tam olarak budur.Ekleme sıralaması bağlı liste ile mi yoksa dizi ile mi daha iyi çalışır?
O(n²) olarak kalır.