sorting-algorithms
Sorting Algorithms (อัลกอริธึมการเรียงลำดับ) เป็นวิธีการจัดเรียงข้อมูลในลำดับที่กำหนด เช่น ลำดับตัวเลขจากน้อยไปหามาก หรือจากมากไปหาน้อย อัลกอริธึมการเรียงลำดับเป็นสิ่งสำคัญในการจัดการข้อมูลในคอมพิวเตอร์ เช่น การจัดเรียงรายการสินค้า, การจัดเรียงข้อมูลทางการเงิน, หรือการค้นหาข้อมูลที่จัดเรียงแล้ว
ในบทความนี้ เราจะทำความเข้าใจเกี่ยวกับอัลกอริธึมการเรียงลำดับที่พบบ่อย รวมถึงข้อดีและข้อเสียของแต่ละอัลกอริธึม
1. Bubble Sort
Bubble Sort คือการเปรียบเทียบค่าที่อยู่ติดกันในลิสต์ แล้วสลับตำแหน่งหากค่าผิดลำดับ และทำซ้ำขั้นตอนนี้จนกว่าลิสต์จะเรียงลำดับ
ขั้นตอน:
- เปรียบเทียบค่าตัวแรกกับค่าตัวที่สอง หากค่าตัวแรกมากกว่าค่าตัวที่สอง ให้สลับตำแหน่ง
- ทำซ้ำจนกว่าจะตรวจสอบครบทุกคู่ที่อยู่ติดกัน
- หากมีการสลับตำแหน่งในรอบที่ผ่านไป ให้ทำการวนซ้ำใหม่จนกว่าไม่มีการสลับตำแหน่ง
ตัวอย่างโค้ด Bubble Sort (Python):
def bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j] # สลับตำแหน่ง
swapped = True
if not swapped:
break # หากไม่มีการสลับในรอบนี้ หมายความว่าเรียงลำดับเสร็จแล้ว
return arr
# การทดสอบ Bubble Sort
arr = [64, 34, 25, 12, 22, 11, 90]
print(bubble_sort(arr))
ผลลัพธ์:
[11, 12, 22, 25, 34, 64, 90]
ข้อดี:
- เข้าใจง่ายและเขียนง่าย
- ไม่ต้องใช้หน่วยความจำเพิ่มเติม
ข้อเสีย:
- ประสิทธิภาพต่ำเมื่อข้อมูลมีขนาดใหญ่ (O(n²))
2. Selection Sort
Selection Sort คือการเลือกค่าน้อยที่สุดจากลิสต์ทั้งหมดและย้ายไปไว้ที่ตำแหน่งแรก จากนั้นเลือกค่าน้อยที่สุดในส่วนที่เหลือ และทำซ้ำจนกว่าจะเรียงลำดับเสร็จ
ขั้นตอน:
- หาค่าต่ำสุดในลิสต์และสลับกับค่าที่อยู่ในตำแหน่งแรก
- หาค่าต่ำสุดในลิสต์ที่เหลือและสลับกับค่าที่อยู่ในตำแหน่งที่สอง
- ทำซ้ำขั้นตอนนี้จนกว่าจะถึงตำแหน่งสุดท้าย
ตัวอย่างโค้ด Selection Sort (Python):
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i] # สลับค่าที่ตำแหน่ง i กับตำแหน่ง min_idx
return arr
# การทดสอบ Selection Sort
arr = [64, 34, 25, 12, 22, 11, 90]
print(selection_sort(arr))
ผลลัพธ์:
[11, 12, 22, 25, 34, 64, 90]
ข้อดี:
- ทำงานได้ดีเมื่อขนาดข้อมูลเล็ก
- ไม่ต้องใช้หน่วยความจำเพิ่มเติม
ข้อเสีย:
- ประสิทธิภาพต่ำเมื่อข้อมูลมีขนาดใหญ่ (O(n²))
3. Insertion Sort
Insertion Sort คือการเลือกค่าจากลิสต์ที่ยังไม่ได้เรียงลำดับและนำมาแทรกไว้ในตำแหน่งที่เหมาะสมในลิสต์ที่เรียงลำดับแล้ว
ขั้นตอน:
- เริ่มจากตำแหน่งที่สอง เปรียบเทียบค่ากับค่าที่อยู่ก่อนหน้า
- ถ้าค่าปัจจุบันเล็กกว่าค่าที่อยู่ก่อนหน้า ให้ย้ายค่าที่มากกว่าไปหนึ่งตำแหน่ง
- ทำซ้ำขั้นตอนนี้จนกว่าจะถึงตำแหน่งสุดท้าย
ตัวอย่างโค้ด Insertion Sort (Python):
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
# การทดสอบ Insertion Sort
arr = [64, 34, 25, 12, 22, 11, 90]
print(insertion_sort(arr))
ผลลัพธ์:
[11, 12, 22, 25, 34, 64, 90]
ข้อดี:
- ดีสำหรับลิสต์ที่มีขนาดเล็กหรือเรียงลำดับเกือบเสร็จแล้ว
- ใช้หน่วยความจำต่ำ (O(1))
ข้อเสีย:
- ประสิทธิภาพต่ำเมื่อข้อมูลมีขนาดใหญ่ (O(n²))
4. Merge Sort
Merge Sort คืออัลกอริธึมแบบ Divide and Conquer ซึ่งแบ่งลิสต์ออกเป็นสองส่วน, เรียงลำดับแต่ละส่วน แล้วรวมผลลัพธ์เข้าด้วยกัน
ขั้นตอน:
- แบ่งลิสต์ออกเป็นสองส่วนจนกระทั่งลิสต์เหลือขนาด 1
- รวมลิสต์ที่เรียงลำดับแล้วเข้าด้วยกันทีละคู่
- ทำซ้ำจนกระทั่งลิสต์ทั้งหมดเรียงลำดับ
ตัวอย่างโค้ด Merge Sort (Python):
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr) // 2 # หาตำแหน่งกลาง
left = arr[:mid]
right = arr[mid:]
merge_sort(left) # เรียงลำดับส่วนซ้าย
merge_sort(right) # เรียงลำดับส่วนขวา
i = j = k = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
arr[k] = left[i]
i += 1
else:
arr[k] = right[j]
j += 1
k += 1
while i < len(left):
arr[k] = left[i]
i += 1
k += 1
while j < len(right):
arr[k] = right[j]
j += 1
k += 1
return arr
# การทดสอบ Merge Sort
arr = [64, 34, 25, 12, 22, 11, 90]
print(merge_sort(arr))
ผลลัพธ์:
[11, 12, 22, 25, 34, 64, 90]
ข้อดี:
- ประสิทธิภาพดีมาก (O(n log n)) สำหรับข้อมูลขนาดใหญ่
- ใช้งานได้ดีสำหรับลิสต์ขนาดใหญ่และข้อมูลที่มีลักษณะไม่เป็นระเบียบ
ข้อเสีย:
- ใช้หน่วยความจำเพิ่มขึ้น O(n) เพราะต้องใช้พื้นที่เพิ่มในการจัดเก็บข้อมูลชั่วคราว
5. Quick Sort
Quick Sort คืออัลกอริธึมแบบ Divide and Conquer ที่เลือกค่ากลาง (pivot) และจัดลำดับข้อมูลที่น้อยกว่าหรือมากกว่ามันไปทางซ้ายหรือขวา จากนั้นทำซ้ำในแต่ละส่วนย่อย
ขั้นตอน:
- เลือก pivot จากข้อมูล
- แบ่งข้อมูลเป็นสองส่วน: ค่าที่น้อยกว่าหรือเท่ากับ pivot อยู่ทางซ้าย และค่าที่มากกว่า pivot อยู่ทางขวา
- เรียกฟังก์ชัน Quick Sort ซ้ำในแต่ละส่วนย่อย
ตัวอย่างโค้ด Quick Sort (Python):
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
# การทดสอบ Quick Sort
arr = [64, 34, 25, 12, 22, 11, 90]
print(quick_sort(arr))
ผลลัพธ์:
[11, 12, 22, 25, 34, 64, 90]
ข้อดี:
- ประสิทธิภาพดีมาก (O(n log n)) สำหรับข้อมูลขนาดใหญ่
- ใช้หน่วยความจำต่ำกว่าการใช้ Merge Sort
ข้อเสีย:
- การเลือก pivot ไม่ดีอาจทำให้มีประสิทธิภาพต่ำในบางกรณี (O(n²))
สรุป
- Bubble Sort, Selection Sort, และ Insertion Sort มีประสิทธิภาพต่ำ (O(n²)) และเหมาะสมสำหรับข้อมูลที่มีขนาดเล็กหรือกรณีที่ไม่ต้องการความเร็วสูง
- Merge Sort และ Quick Sort เป็นอัลกอริธึมที่มีประสิทธิภาพดีกว่า (O(n log n)) และเหมาะสมสำหรับข้อมูลขนาดใหญ่