มันไม่ง่ายเลยที่จะเข้าใจ Sorting Algorithm ep.3

Ming Ruengjaruwatana
2 min readApr 10, 2018

--

ความเดิมตอนที่แล้ว

จากตอนที่แล้วเรารู้จักวิธี Sorting ไปหนึ่งแบบแล้ว(ง่ายที่สุดแล้วด้วย) ตอนนี้เราจะลองดูตัวง่ายๆอีกสักตัวนึงซึ่งเราจะมาเจาะลึกเจ้า Sorting ที่มีชื่อว่า Selection sort นั่นเอง

ไม่ต้องพูดพร่ำทำเพลงให้มากความ ลองก้มลงไปดูเลยครับ

Selection Sort

อันนี้ Sealect Tuna

เป็นอีกหนึ่งวิธีของการเรียงลำดับข้อมูลที่มีวิธีการคิดที่ไม่ซับซ้อนมาก คล้ายๆกับ Bubble sort นั่นแหละ

ซึ่ง Selection sort ก็แปลมาจากคำว่า Selection หรือก็คือ การเลือกนั่นเอง แสดงว่าการเรียงแบบนี้จะมีวิธีคิดหลักคือเลือกข้อมูลมาเรียงทีละตัวยังไงล่ะ

โปรดหาอาหารมาทานก่อนชม

วิธีการคิดแบบ Selection ๆ

ก่อนจะทำอาหารก็ต้องมีวัตถุดิบ การเรียงข้อมูลก็เหมือนกันก็ต้องมีข้อมูลดิบ(กำลังหิว nugget พอดิบพอดี)

1 จิบ

มาเริ่มคิดกันเถอะ

ขั้นแรก : หาข้อมูลที่มีค่าน้อยที่สุดในแถวก่อน โดยเปรียบเทียบทีละตัว

วิธีการหาค่าที่น้อยที่สุดหลาย ๆ ท่านหลาย ๆ คนคงจะคุ้นเคยกันมาบ้าง แต่จะขออธิบายซักเล็กน้อย เป็น extra สำหรับจอมยุทธฝึกหัด

เราจะมีป้ายๆหนึ่ง ที่จะบอกตัวที่มีค่าที่น้อยที่สุด แล้วเราก็จะเอาแต่ละตัวของแถวข้อมูลมาเปรียบเทียบกับป้าย หากค่าไหนที่มีค่าน้อยกว่าป้ายแล้ว ป้ายก็จะเอาค่านั้นมาแทน

2 จิบ

จะเห็นว่าเราให้ป้ายนี้เก็บค่าตัวแรก(ตัวที่ 0)ไว้ก่อนเป็นค่าเริ่มต้น

แล้วเราจะมาเริ่มเทียบกันไปเรื่อยๆ

ไม่จริงนะจ๊ะ

จากภาพด้านบนเราจะเห็นว่า ตัวที่ 1(มีค่า 5) ไม่ได้น้อยกว่าตัวที่ 0(มีค่า2) ป้ายจึงยังคงค่า 2 ไว้

เจอตัวน้อยกว่าแล้ว!?

เมื่อเราเทียบๆไปเรื่อยๆจะเห็นว่า มีตัวที่ 5 (มีค่า 1 ) มีค่าน้อยกว่า ค่าตัวที่ 0 จริงป้ายจึงนำค่าจองตัวที่ 5 เข้าไปใส่ในป้ายแทน

ใส่เข้าไป!!

หมับเข้าให้

ดังนั้นแล้วเราจะได้ค่าที่น้อยที่สุดในแถว นั่นก็คือ 1 นั่นเอง

ขั้นที่สอง : เมื่อเราได้ค่าที่น้อยที่สุดในแถวเราก็เอามันไปใส่ในตัวแรกสุดของแถวเลย เพราะมันตัวที่น้อยที่สุดของแถวไง โดยการสลับตัวที่มีค่าน้อยที่สุดกับ ตัวแรกซะ

สลับ

เราก็จะถือว่าเสร็จ 1 รอบการสลับ แล้วเราก็จะตัดตัวแรกออกไปเพราะมันอยู่ถูกที่ถูกทางแล้ว

ขั้นที่สาม : ทำซ้ำจนกว่าจะเสร็จสมบูรณ์

เสร็จแล้ว เย้

ทำความเข้าใจเสร็จแล้วก็มาดูการเขียนโปรแกรมกันต่อ

จะเห็นว่า ป้ายที่เราสมมติขึ้นมานั่นคือ ตัวแปร min_index ด้วยเป้าหมายให้เราพยายามเก็บตำแหน่งของตัวที่น้อยที่สุดเอาไว้ แทนที่จะเก็บค่ามันแทน เพื่อทำให้การสลับข้อมูลของเรามีความสะดวกยิ่งขึ้น

ผลการทำงานก็จะได้ดังนี้

Unsorted data : 5 3 4 6 2 7
Sorted data : 2 3 4 5 6 7

จากที่เห็นการเรียงแบบนี้จะเห็นว่า มีวิธีคิดที่ยังไม่ยากมาก และอาจจะเป็นวิธีคิดที่เราจินตนาการง่ายด้วย (ส่วนตัวผู้เขียนคิดว่าวิธีนี้มีพื้นฐานการคิดง่ายกว่าแบบฟองด้วย)แต่วิธีนี้ก็ยังไม่ใช่วิธีที่มีประสิทธิภาพพออีก

เนื่องจากเราต้องมีการเปรียบเทียบค่าที่น้อยที่สุดซึ่ง เราจะต้องเปรียบเทียบเป็นเท่าตัวอีกหากมีข้อมูลเยอะๆ ก็ยิ่งทำให้ตัวคอมพิวเตอร์ที่ใช้การเรียงแบบนี้ทำงานนานและหนักเข้าไปอีก

So frustating

สำหรับตอนนี้เราเพิ่มความปวดหัวเล็กน้อย ด้วยวิธีการง่ายๆ ตอนหน้าอาจจะมีวิธีหฤโหดรอเราอยู่ ติดตามต่อตอนหน้าครับ

--

--

Ming Ruengjaruwatana

Graduated with a bachelor of engineering from PSU. Now working as a web developer at Tailor Solutions.