Notes & software courses · Free to learn
Aph's Blog
On this page

การเรียงลำดับ (Sorting)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

เข้าใจหลักการเรียงลำดับพื้นฐาน complexity ของแต่ละแบบ และการใช้ sorted() ในงานจริง

การเรียงลำดับเป็นพื้นฐานที่ใช้บ่อย และเป็นหัวข้อคลาสสิกในการเรียนอัลกอริทึม ในงานจริงเราใช้ sorted() ของภาษาเลย (ซึ่งเป็น O(n log n) ที่ปรับแต่งมาดีแล้ว) แต่ควรเข้าใจหลักการเบื้องหลังและ complexity เพื่อตอบสัมภาษณ์และเลือกใช้เป็น

ในงานจริง: ใช้ sorted() และ .sort()

python
nums = [3, 1, 4, 1, 5, 9, 2]

print(sorted(nums))               # [1,1,2,3,4,5,9] (คืนลิสต์ใหม่)
print(sorted(nums, reverse=True)) # [9,5,4,3,2,1,1] (มากไปน้อย)

nums.sort()                       # เรียงในตัวเอง (ของเดิมเปลี่ยน)

# เรียงตามเงื่อนไขด้วย key
words = ["banana", "kiwi", "apple"]
print(sorted(words, key=len))     # ['kiwi','apple','banana'] (ตามความยาว)

people = [{"name": "A", "age": 30}, {"name": "B", "age": 20}]
print(sorted(people, key=lambda p: p["age"]))  # เรียงตามอายุ
sorted() vs .sort()

sorted(x) คืนลิสต์ใหม่ ไม่แตะของเดิม ส่วน x.sort() เรียงในตัวมันเอง (ของเดิมเปลี่ยน) เลือกใช้ตามว่าต้องการเก็บลิสต์เดิมไว้ไหม

Bubble Sort — เข้าใจง่ายแต่ช้า O(n²)

เปรียบเทียบสมาชิกคู่ที่อยู่ติดกัน สลับถ้าผิดลำดับ ทำซ้ำจนไม่มีอะไรต้องสลับ ตัวที่ใหญ่สุดจะ "ลอย" ไปท้ายเหมือนฟองอากาศ — จึงชื่อ bubble

python
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(n - 1 - i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]  # สลับ
    return arr

print(bubble_sort([5, 2, 8, 1, 9]))  # [1, 2, 5, 8, 9]

หลักการของ Merge Sort และ Quick Sort

สอง algorithm นี้เร็วกว่า (O(n log n)) ด้วยแนวคิด "แบ่งแล้วพิชิต" (divide and conquer) ไม่ต้องท่อง implement เป๊ะ แต่ควรเข้าใจไอเดีย

  • Merge Sort: แบ่งลิสต์ครึ่ง ๆ จนเหลือตัวเดียว แล้วค่อย ๆ รวม (merge) กลับแบบเรียงลำดับ — เสถียร แต่ใช้หน่วยความจำเพิ่ม
  • Quick Sort: เลือกตัว "pivot" แล้วแบ่งของที่น้อยกว่าไปซ้าย มากกว่าไปขวา แล้วทำซ้ำกับแต่ละฝั่ง — เร็วในทางปฏิบัติ แต่ worst case O(n²)
Algorithmเวลาเฉลี่ยWorstหมายเหตุ
Bubble / Insertion / SelectionO(n²)O(n²)เข้าใจง่าย ใช้สอน
Merge SortO(n log n)O(n log n)เสถียร ใช้ memory เพิ่ม
Quick SortO(n log n)O(n²)เร็วจริงในทางปฏิบัติ
sorted() ของ PythonO(n log n)O(n log n)ใช้ตัวนี้ในงานจริง

สรุปหัวข้อนี้

  • งานจริงใช้ sorted() (คืนใหม่) หรือ .sort() (ในตัว) — ปรับ key และ reverse ได้
  • Bubble sort O(n²): เปรียบเทียบคู่ติดกันแล้วสลับ เข้าใจง่ายแต่ช้า
  • Merge/Quick sort O(n log n): ใช้แนวคิดแบ่งแล้วพิชิต เร็วกว่ามากเมื่อ n ใหญ่
  • เข้าใจ complexity และไอเดีย พอสำหรับสัมภาษณ์ — ไม่ต้องท่อง implement ทุกตัว
แบบฝึกหัด

1) เขียน bubble sort เอง แล้วทดสอบ 2) เรียงลิสต์ชื่อตามความยาว ด้วย sorted(key=len) 3) เรียงลิสต์ dict นักเรียนตามคะแนนจากมากไปน้อย 4) เรียงลิสต์ตัวเลขจากมากไปน้อยโดยไม่ใช้ reverse=True (คิดวิธี)