Bubble Sort เป็นอัลกอริทึมจัดเรียงง่ายๆ ที่เปรียบเทียบค่าติดกัน และสลับที่กันถ้าลำดับผิด รอบแรกค่ามากสุดจะไปอยู่ท้าย รอบที่สองค่ามากอันดับสองไปอยู่ลำดับสองท้าย ทำซ้ำจนเรียบร้อย
อัลกอริทึม Bubble Sort (Iterative)
- int arr[5] = { 5,4,2,1,3 };
- Loop i = 0 ถึง n-1
- Loop j = 0 ถึง n-i-2
- ถ้า arr[j] > arr[j+1] ให้สลับ
Recursive Bubble Sort (แบบเรียกซ้ำ)
- Base Case: ถ้าความยาวอาร์เรย์ = 1 ให้ return
- วนลูปผ่านอาร์เรย์ 1 รอบ ย้ายค่ามากสุดไปท้าย
- เรียกฟังก์ชันซ้ำด้วยความยาวลดลง 1 (ไม่ต้องตรวจสอบท้ายที่เรียงแล้ว)
ตัวอย่างการทำงาน
Input: Arr[] = { 5,7,2,3,1,4 }, length=6
Output: Sorted array: 1 2 3 4 5 7
First Pass: 5 7 2 3 1 4 → swap → 5 2 7 3 1 4 → swap → 5 2 3 7 1 4 → swap → 5 2 3 1 7 4 → swap → 5 2 3 1 4 7 Second Pass: 5 2 3 1 4 7 → swap → 2 5 3 1 4 7 → swap → 2 3 5 1 4 7 → swap → 2 3 1 5 4 7 → swap → 2 3 1 4 5 7 Third Pass: 2 3 1 4 5 7 → swap → 2 1 3 4 5 7 (no more swaps) Fourth Pass: 2 1 3 4 5 7 → swap → 1 2 3 4 5 7 (sorted)
โค้ดโปรแกรม Recursive Bubble Sort
#include <stdio.h>
void recurBubbleSort(int arr[], int len) {
int temp;
if (len == 1) {
return; // Base case
}
// One pass: bubble largest to end
for (int i = 0; i < len - 1; i++) {
if (arr[i] > arr[i + 1]) {
temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
// Recursive call for remaining array
recurBubbleSort(arr, len - 1);
}
int main() {
int Arr[] = {21, 34, 20, 31, 78, 43, 66};
int length = sizeof(Arr) / sizeof(Arr[0]);
recurBubbleSort(Arr, length);
printf("Sorted array: ");
for (int i = 0; i < length; i++) {
printf("%d ", Arr[i]);
}
return 0;
}
ผลลัพธ์
Sorted array: 20 21 31 34 43 66 78
ความซับซ้อน (Complexity)
- Time: O(n²) - เหมือน Iterative version
- Space: O(n) - เนื่องจาก Recursion Stack (Iterative ใช้ O(1))
หมายเหตุ: Recursive Bubble Sort เหมาะสำหรับการศึกษา ในการใช้งานจริงควรใช้ qsort() หรืออัลกอริทึมที่ดีกว่า (Quick Sort, Merge Sort)