Kabarcık Sıralaması
Son güncelleme
Kabarcık sıralaması listeyi tekrar tekrar dolaşır, her komşu eleman çiftini karşılaştırır ve yanlış sıradaysalar onları takas eder. Her tam geçişten sonra kalan en büyük değer, doğru konumuna sona doğru "kabarmış" olur, bu yüzden her geçiş bir eleman daha az inceler. Karşılaştırmaları ve takasları izlemek için yukarıdan oynat'a basın ya da onları teker teker adımlayın.
Anlaşılması en kolay sıralama algoritmalarından biridir ve bu onu harika bir ilk algoritma yapar, ancak O(n²) çalışma süresi büyük girdiler için onu pratik olmaktan çıkarır.
Zaman ve alan karmaşıklığı
| Durum | Karmaşıklık | Notlar |
|---|---|---|
| En iyi durum | O(n) | Zaten sıralı, erken çıkış kontrolüyle |
| Ortalama durum | O(n²) | Rastgele sıra |
| En kötü durum | O(n²) | Ters sıralı |
| Alan | O(1) | Yerinde, yalnızca bir geçici değişken |
| Kararlı | Evet | Eşit elemanlar göreli sırasını korur |
Adım adım
| Adım | Ne olur |
|---|---|
| 1 | Dizinin başından başlayın. |
| 2 | Mevcut elemanı bir sonrakiyle karşılaştırın. |
| 3 | Sırasızlarsa, onları takas edin. |
| 4 | Bir konum sağa gidin ve sona kadar tekrarlayın (bir geçiş). |
| 5 | Geçişleri tekrarlayın; her geçiş sonda bir eleman daha sabitler. |
| 6 | Tam bir geçiş hiç takas yapmadığında durun. |
Çözümlü örnek
[5, 2, 4, 1] sıralanıyor:
| Geçiş | Dizi | Eylem |
|---|---|---|
| 1 | [2, 4, 1, 5] | 5,2, sonra 5,4, sonra 5,1 takas edilir; 5 sona kabarır. |
| 2 | [2, 1, 4, 5] | 2,4 sıralı; 4,1 takas edilir; 4,5 sıralı; 4 artık yerleşti. |
| 3 | [1, 2, 4, 5] | 2,1 takas edilir; geri kalan zaten sıralı; 2 yerleşti. |
| 4 | [1, 2, 4, 5] | Tam bir geçiş hiç takas yapmaz, bu yüzden dizi sıralanmıştır ve algoritma durur. |
Kabarcık sıralaması ne zaman kullanılır
| Şu durumda kullanın | Şu durumda kaçının |
|---|---|
| Karşılaştırmalı sıralamaların nasıl çalıştığını öğretiyor veya öğreniyorsanız | O(n²)'nin çok yavaş olduğu büyük girdileri sıralıyorsanız |
Girdi çok küçük veya neredeyse sıralıysa (erken çıkışla O(n)'e yaklaşır) | En hızlı genel amaçlı sıralamaya ihtiyacınız varsa - quicksort veya merge sort kullanın |
| Neredeyse hiç kod olmadan kararlı, yerinde bir sıralama istiyorsanız | Veri rastgele sıradaysa ve performans önemliyse |
| Kısa bir listenin tek geçişte zaten sıralı olup olmadığını tespit ediyorsanız | Çok sayıda yazma pahalıysa (ör. flash bellek); seçmeli sıralama daha az takas yapar |
Bubble Sort kodu
Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Bubble Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.
Python ile Bubble Sort kodu
1def bubble_sort(a):2 n = len(a)3 for i in range(n - 1):4 swapped = False5 for j in range(n - 1 - i):6 if a[j] > a[j + 1]:7 a[j], a[j + 1] = a[j + 1], a[j]8 swapped = True9 if not swapped:10 break # no swaps means the list is already sorted11 return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)JavaScript ile Bubble Sort kodu
1function bubbleSort(a) {2 for (let end = a.length - 1; end > 0; end--) {3 let swapped = false;4 for (let j = 0; j < end; j++) {5 if (a[j] > a[j + 1]) {6 [a[j], a[j + 1]] = [a[j + 1], a[j]];7 swapped = true;8 }9 }10 if (!swapped) break; // Already sorted: stop early11 }12 return a;13}14
15const data = [5, 2, 9, 1, 7, 3];16console.log("Before:", data);17console.log("Sorted:", bubbleSort([...data]));Java ile Bubble Sort kodu
1import java.util.Arrays;2
3public class Main {4 static void bubbleSort(int[] arr) {5 for (int i = arr.length - 1; i > 0; i--) {6 boolean swapped = false;7 for (int j = 0; j < i; j++) {8 if (arr[j] > arr[j + 1]) {9 int tmp = arr[j];10 arr[j] = arr[j + 1];11 arr[j + 1] = tmp;12 swapped = true;13 }14 }15 if (!swapped) break; // already sorted16 }17 }18
19 public static void main(String[] args) {20 int[] arr = {5, 1, 4, 2, 8, 3};21 System.out.println("Before: " + Arrays.toString(arr));22 bubbleSort(arr);23 System.out.println("After: " + Arrays.toString(arr));24 }25}C++ ile Bubble 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 bubbleSort(std::vector<int>& a) {11 for (size_t pass = 0; pass + 1 < a.size(); ++pass) {12 bool swapped = false;13 // Each pass bubbles the largest remaining value to the end14 for (size_t j = 0; j + 1 < a.size() - pass; ++j) {15 if (a[j] > a[j + 1]) {16 std::swap(a[j], a[j + 1]);17 swapped = true;18 }19 }20 if (!swapped) break; // already sorted21 }22}23
24int main() {25 std::vector<int> data = {5, 1, 4, 2, 8, 3};26 std::cout << "Before: ";27 printVec(data);28 bubbleSort(data);29 std::cout << "After: ";30 printVec(data);31 return 0;32}C ile Bubble Sort kodu
1#include <stdbool.h>2#include <stdio.h>3
4void printArr(const int a[], int n) {5 for (int i = 0; i < n; i++) printf("%d ", a[i]);6 printf("\n");7}8
9void bubbleSort(int a[], int n) {10 for (int pass = 0; pass < n - 1; pass++) {11 bool swapped = false;12 // Each pass bubbles the largest remaining value to the end13 for (int j = 0; j < n - 1 - pass; j++) {14 if (a[j] > a[j + 1]) {15 int tmp = a[j];16 a[j] = a[j + 1];17 a[j + 1] = tmp;18 swapped = true;19 }20 }21 if (!swapped) break; // already sorted22 }23}24
25int main(void) {26 int data[] = {5, 1, 4, 2, 8, 3};27 int n = sizeof(data) / sizeof(data[0]);28 printf("Before: ");29 printArr(data, n);30 bubbleSort(data, n);31 printf("After: ");32 printArr(data, n);33 return 0;34}Kabarcık Sıralaması SSS
Kabarcık sıralamasının zaman karmaşıklığı nedir?
O(n²) sürede çalışır. Erken çıkış optimizasyonuyla zaten sıralı bir dizide O(n)'e ulaşabilir. O(1) ek alan kullanır.Kabarcık sıralaması kararlı mıdır?
Neden kabarcık sıralaması denir?
Kabarcık sıralaması ile eklemeli sıralama arasındaki fark nedir?
O(n²)'de çalışır, kararlı ve yerindedir, ancak veriyi farklı taşırlar: kabarcık sıralaması sırasız komşu çiftleri tekrar tekrar takas eder, eklemeli sıralama ise her elemanı alıp sıralı ön ekteki doğru yerine kaydırır. Eklemeli sıralama genellikle daha az yazma yapar ve pratikte, özellikle neredeyse sıralı veride, daha hızlı çalışır.Quicksort yerine kabarcık sıralamasını ne zaman kullanmalıyım?
O(n log n) ortalama süresi, çok küçük girdiler dışında her şeyde kabarcık sıralamasının O(n²)'sini ezer. Kabarcık sıralaması yalnızca liste çok küçük veya neredeyse sıralıyken ya da öğretmek için mümkün olan en basit kararlı sıralamayı istediğinizde tercih edilmeye değer.Erken çıkış optimizasyonu kabarcık sıralamasının en kötü durumunu değiştirir mi?
O(n)'e ulaşmasını sağlar, ancak ters sıralı bir dizi yine de her karşılaştırmaya ihtiyaç duyar, bu yüzden en kötü durum O(n²) olarak kalır. Optimizasyon yalnızca en iyi ve neredeyse sıralı durumlara yardımcı olur.