รูปปกบทความ

1. 🎯 ตอนที่ 13: 3 ทหารเสือแห่งการเรียงลำดับ (Bubble, Selection, Insertion)

2. 📖 เปิดฉาก (The Hook)

น้องๆ เคยเล่นไพ่กันไหมครับ? เวลาเราหยิบไพ่ขึ้นมาบนมือ สัญชาตญาณแรกของเราคือการสลับไพ่เรียงจากน้อยไปมาก เพื่อให้ง่ายต่อการวางแผน… สำหรับมนุษย์อย่างเรา การกวาดตามองและสลับไพ่มันดูเป็นเรื่องธรรมชาติมากๆ แต่สำหรับคอมพิวเตอร์ที่มองเห็นข้อมูลได้ทีละช่อง การจะสั่งให้มัน “เรียงลำดับ (Sorting)” ข้อมูลนับล้านๆ เรคคอร์ด ถือเป็นศาสตร์และศิลป์ที่ท้าทายสุดๆ ครับ!

ในโลกของการสัมภาษณ์งาน โปรแกรมเมอร์มือใหม่หลายคนมักจะโดนดักคอด้วยคำถามที่ว่า “อัลกอริทึมการเรียงลำดับที่ช้าแบบ $O(n^2)$ อย่าง Bubble, Selection และ Insertion Sort มันยังมีความจำเป็นอยู่อีกหรอ ในเมื่อเรามีของแรงๆ อย่าง Quick Sort?”

วันนี้พี่จะพาไปขุดคุ้ยการทำงานของ “3 ทหารเสือแห่งการเรียงลำดับ” เพื่อให้น้องๆ เข้าใจเบื้องลึกว่า ถึงแม้มันจะช้าเป็นเต่าคลานเมื่อเจอข้อมูลขนาดใหญ่ แต่มันกลับมี “พลังแฝง” บางอย่างที่ทำให้อัลกอริทึมระดับโลกอย่าง Timsort (ที่ Python ใช้อยู่หลังบ้าน) ยังต้องพึ่งพามัน!

3. 🧠 แก่นวิชา (Core Concepts)

อัลกอริทึม 3 ตัวนี้จัดอยู่ในหมวดหมู่ของการเรียงลำดับที่ต้องเปรียบเทียบข้อมูล (Comparison-based Sorting) ซึ่งมีการทำงานที่แตกต่างกันดังนี้ครับ:

1. Bubble Sort (นักสลับที่บ้าคลั่ง)

  • คอนเซปต์: เปรียบเทียบข้อมูลที่อยู่ติดกันเป็นคู่ๆ (Adjacent elements) ถ้าตัวหน้าใหญ่กว่าตัวหลัง ก็ “สลับที่ (Swap)” กันทันที! ทำแบบนี้วนไปเรื่อยๆ จนกว่าค่าที่ใหญ่ที่สุดจะลอยไปอยู่ท้ายสุดของ Array เหมือน “ฟองอากาศ (Bubble)” ที่ลอยขึ้นผิวน้ำ
  • Time Complexity: $O(n^2)$ เสมอในกรณีทั่วไป เพราะต้องใช้ลูปซ้อนลูปวนเช็คทุกตัว ช้าที่สุดในแก๊งค์นี้ครับ

2. Selection Sort (นักเลือกที่แม่นยำ)

  • คอนเซปต์: แทนที่จะสลับมั่วซั่ว มันจะกวาดสายตาหา “คนที่เตี้ยที่สุด (Minimum)” ในแถวให้เจอก่อน แล้วค่อยลากคนนั้นมาสลับที่กับคนแรกสุดของแถว จากนั้นก็หาคนที่เตี้ยรองลงมา ไปไว้ตำแหน่งที่สอง ทำแบบนี้ไปเรื่อยๆ
  • Time Complexity: $O(n^2)$ เสมอ ไม่ว่าข้อมูลจะเรียงมาดีแค่ไหนก็ต้องกวาดตาดูทุกคนอยู่ดี แต่ข้อดีคือ “มีจำนวนการสลับที่ (Swaps) น้อยกว่า Bubble Sort มาก” (แค่ $O(n)$ ครั้ง)

3. Insertion Sort (เซียนเรียงไพ่)

  • คอนเซปต์: นี่คือวิธีเดียวกับที่เราเรียงไพ่บนมือเลยครับ! เราจะแบ่งข้อมูลเป็นฝั่งที่ “เรียงแล้ว” กับ “ยังไม่เรียง” จากนั้นหยิบไพ่ใบที่ยังไม่เรียงขึ้นมาทีละใบ แล้วแทรก (Insert) ลงไปในตำแหน่งที่ถูกต้องของฝั่งที่เรียงแล้ว
  • Time Complexity: ในกรณีโชคร้ายสุด (Worst-case) คือ $O(n^2)$ แต่ความเทพของมันคือ ความสามารถในการปรับตัว (Adaptive) ถ้าข้อมูล “เกือบจะเรียงลำดับมาอยู่แล้ว” มันจะทำงานเสร็จด้วยความเร็วแสงระดับ $O(n)$!
รูปประกอบ

4. 💻 ร่ายมนต์โค้ด (Show me the Code)

ในบรรดา 3 ตัวนี้ Insertion Sort ถือเป็นตัวที่ทรงคุณค่าและใช้งานจริงบ่อยที่สุด พี่เลยขอหยิบยกโค้ด Python ของมันมาให้น้องๆ ดูกันครับ:

# ฟังก์ชันเรียงลำดับแบบ Insertion Sort (In-place Sorting)
def insertion_sort(arr):
    # เริ่มจากหยิบไพ่ใบที่ 2 (index 1) เป็นต้นไป เพราะถือว่าใบแรกเรียงแล้ว
    for i in range(1, len(arr)):
        key = arr[i]  # หยิบไพ่ขึ้นมาไว้ในมือ (นี่คือค่าที่เราต้องการหาที่แทรก)
        j = i - 1     # มองไปที่ไพ่ใบก่อนหน้า (ใบที่อยู่ทางซ้าย)
        
        # วนลูปถอยหลัง: ถ้าไพ่ใบก่อนหน้ามีค่า "มากกว่า" ไพ่ในมือเรา
        # ให้ขยับไพ่ใบนั้นไปทางขวา 1 ช่อง เพื่อสร้างพื้นที่ว่าง (Hole)
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]  # เลื่อนของใหญ่หลบไปทางขวา
            j -= 1               # ถอยไปดูใบก่อนหน้าอีก
            
        # เมื่อเจอตำแหน่งที่ถูกต้อง (หรือถอยจนสุดทาง) ก็วางไพ่ในมือลงไปเลย!
        arr[j + 1] = key

    return arr

# ----- ลองวิชา -----
my_data =
print("ข้อมูลที่เรียงแล้ว:", insertion_sort(my_data))
# Output:

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

ถ้าน้องๆ ถูกกรรมการสัมภาษณ์ถามว่า “ในเมื่อ Merge Sort หรือ Quick Sort มันเร็วกว่าระดับ $O(n \log n)$ แล้วเราจะเรียนอัลกอริทึมเต่าคลานแบบ $O(n^2)$ ไปทำไม?” ให้งัดเคล็ดลับจากคัมภีร์ Data Structures & Algorithms in Python ไปตอบเลยครับ:

  1. Overhead ต่ำมากสำหรับข้อมูลขนาดเล็ก: อัลกอริทึมที่เร็วๆ อย่าง Quick Sort มีขั้นตอนการจัดการหน่วยความจำ (Recursion Call Stack) ที่กินทรัพยากรสูงมาก หากเรามีข้อมูลใน Array แค่ 10-20 ตัว การใช้ Insertion Sort จะรันเสร็จไวกว่า Quick Sort ซะอีก!
  2. ความเป็นเลิศเรื่อง “ข้อมูลเกือบจะเรียงแล้ว (Nearly Sorted)”: ในโลกจริง ข้อมูลล็อกไฟล์หรือฐานข้อมูลมักจะมีการเรียงลำดับมาบ้างแล้ว Insertion Sort ทำงานแบบ Adaptive จึงใช้เวลาเพียง $O(n)$ ในกรณีนี้
  3. ท่าไม้ตายลับระดับโลก (Timsort): ภาษา Python และ Java ใช้ Sorting Algorithm เริ่มต้นที่ชื่อว่า Timsort ซึ่งเป็นการเอาข้อดีของสองโลกมาผสมกัน (Hybrid) โดยระบบจะแบ่งข้อมูลเป็นก้อนเล็กๆ (Chunks) แล้วใช้ Insertion Sort จัดการเรียงก้อนเล็กๆ เหล่านั้นให้เสร็จก่อน จากนั้นค่อยใช้พลังของ Merge Sort รวบรวมก้อนทั้งหมดเข้าด้วยกันอีกที! นี่แหละครับคือเหตุผลที่โปรแกรมเมอร์ทุกคนต้องรู้จักรากฐานเหล่านี้

6. 🏁 บทสรุป (To be continued…)

Bubble, Selection และ Insertion Sort คือบทเรียนแรกที่ช่วยฝึกวิธีคิด (Logical Thinking) และสอนให้เราเข้าใจถึงเรื่อง Time Complexity ได้อย่างเห็นภาพที่สุด และสอนให้เรารู้ว่า “ไม่มีอัลกอริทึมไหนที่แย่ที่สุด มีแต่อัลกอริทึมที่ถูกใช้ผิดสถานการณ์”

เมื่อเราเริ่มรับมือกับข้อมูลขนาดใหญ่มหาศาล อัลกอริทึมเหล่านี้จะถึงขีดจำกัดของมัน ในตอนหน้า พี่จะพาน้องๆ ไปปลดล็อกพลังแห่งการ “แบ่งแยกและเอาชนะ (Divide and Conquer)” ด้วยการทำความรู้จักกับ Merge Sort และ Quick Sort ที่บริษัทระดับ FAANG ใช้เป็นอาวุธหลัก! เตรียมตัวกันให้พร้อม แล้วเจอกันครับ!


ต้องการที่ปรึกษาด้านการออกแบบ System Architecture และพัฒนาระบบซอฟต์แวร์สเกลใหญ่ให้กับองค์กรของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและพัฒนาซอฟต์แวร์แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p