ภาพรวม
Stooge Sort เป็นอัลกอริทึมเรียงลำดับแบบ Recursive ที่มีลักษณะเฉพาะตัว: แบ่งอาร์เรย์เป็น 2 ส่วนทับซ้อนกัน (2/3 แต่ละส่วน) และเรียงซ้ำ 3 รอบ (ซ้าย, ขวา, ซ้ายอีกครั้ง) ความซับซ้อนด้านเวลา O(n^log₃/₁.₅) ≈ O(n^2.7095) ช้ากว่า Bubble Sort ใช้เพื่อการศึกษา/ทดสอบเท่านั้น
อัลกอริธึม
- ถ้าขนาดส่วน ≤ 2: เปรียบเทียบและสลับถ้าจำเป็น
- คำนวณ
temp = (end - start + 1) / 3(ขนาด 1/3) - เรียงส่วนซ้าย 2/3:
StoogeSort(arr, start, end - temp) - เรียงส่วนขวา 2/3:
StoogeSort(arr, start + temp, end) - เรียงส่วนซ้าย 2/3 อีกครั้ง:
StoogeSort(arr, start, end - temp)
โค้ดตัวอย่าง
#include <iostream>
#include <vector>
using namespace std;
void stoogeSort(vector& arr, int start, int end) {
if (end - start + 1 <= 2) {
if (arr[end] < arr[start]) {
swap(arr[start], arr[end]);
}
return;
}
int temp = (end - start + 1) / 3;
stoogeSort(arr, start, end - temp); // ส่วนซ้าย 2/3
stoogeSort(arr, start + temp, end); // ส่วนขวา 2/3
stoogeSort(arr, start, end - temp); // ส่วนซ้าย 2/3 อีกครั้ง
}
int main() {
int n;
cout << "Enter the number of data elements to be sorted: ";
cin >> n;
vector arr(n);
for (int i = 0; i < n; i++) {
cout << "Enter element " << i+1 << ": ";
cin >> arr[i];
}
stoogeSort(arr, 0, n-1);
cout << "\nSorted Data: ";
for (int val : arr) cout << "->" << val;
return 0;
}
ผลลัพธ์ตัวอย่าง
Enter the number of data elements to be sorted: 4
Enter element 1: 6
Enter element 2: 7
Enter element 3: 3
Enter element 4: 2
Sorted Data: ->2->3->6->7
การวิเคราะห์
- ความซับซ้อน: T(n) = 3T(2n/3) + O(1) → O(n^log₁.₅3) ≈ O(n^2.7095)
- เปรียบเทียบ: ช้ากว่า Bubble Sort (O(n²)), Insertion Sort (O(n²)), แม้แต่ Bogosort ในบางกรณี
- ใช้ได้เมื่อไหร่: ใช้สำหรับการสอนหลักการ Recursive, การทดสอบเวลา, หรือเพื่อความสนุก ไม่ควรใช้ใน Production
- ชื่อ由来: มาจากทีมตลก "The Three Stooges" ที่ทำซ้ำกัน 3 ครั้ง