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

Ming Ruengjaruwatana
3 min readApr 3, 2018

--

มันไม่ง่ายเลยที่จะเข้าใจ Bubble sort

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

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

ซึ่งใน episode ที่สองนี้เราจะเริ่มจากวิธีการที่มีหลักการคิดง่าย ๆ ก่อน เหมือนกับเราหัดเดินตอนเด็ก ๆ นั่นแหละพอเริ่มเก่งแล้วค่อยกระโดดโลดเต้น คิดอะไรแผลง ๆ ได้ตามที่เราต้องการ

เจ้าตัวแรกนี้นั่นก็คือ Bubble sort นั่นเอง เป็นอย่างไร แง้มลงไปดูข้างล่างเลยครับ

Bubble sort

เจ้า Bubble sort ตัวนี้หนึ่งในวิธีที่เป็นพื้นฐานของการเรียงข้อมูลในหลาย ๆ แบบ เนื่องด้วยความที่เป็นวิธีที่มีแนวคิดที่ง่ายและไม่ซับซ้อนมาก จึงเป็นวิธีที่เราควรจะศึกษาเป็นตัวแรกเพื่อทำความคุ้นเคยกับวิถีชีวิตของแก๊ง sorting พวกนี้

โดย Bubble sort ถ้าแปลเป็นภาษาไทยเราก็คือ การเรียงลำดับแบบฟอง(bubble แปลกันตามตัวเลย ฟองสบู่) ซึ่งชื่อนี้ก็มีที่มาจากตัวฟองสบู่นี่แหละ (โอ หิวโค้ก…)

ขอบคุณภาพสวยๆจาก https://gph.is/XIaAMY

Bubble sort ก็มีแนวคิดที่ค่อยๆนำข้อมูลที่มีค่าน้อย ๆ ลอยขึ้นมาเรื่อย ๆ ตามลำดับเหมือนกับฟองสบู่ที่พยายามที่จะลอยขึ้นมาบนผิวน้ำยังไงล่ะ

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

วิธีการคิดเจ้าฟองสบู่เจ้าปัญหา

ก่อนอื่นเราลองสมมติแถวข้อมูลขึ้นมาซักแถวหนึ่ง แล้วเราลองมองแบบแนวตั้งตามธรรมชาติฟองสบู่กัน(จะมองเป็นแนวนอนก็ได้ตามสะดวกครับ)

ข้อมูลนิรนามหนึ่งแถว

เราจะเริ่มทำการเรียงแบบ Bubble sort กัน

ขั้นแรก : เราจะเช็คกันไปทีละตัว โดยเราจะพิจารณาตัวปัจจุบันกับตัวถัดไป

ดูดีๆนะ

ขั้นสอง : พิจารณาว่า ตัวปัจจุบันมีค่ามากกว่าตัวถัดไปหรือไม่ ถ้าใช่ให้สลับกัน

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

เช็คดูซิ

ขั้นสาม : เลื่อนตัวปัจจุบันไปที่ตัวถัดไป แล้วขยับตัวถัดไปไปอีกแล้วทำขึ้นตอนที่ 1 และ 2 ต่อจนหมดแถว

เจอเงื่อนไขที่ถูกต้องแล้ว

จะเห็นว่าตัวปัจจุบัน(5) มีค่ามากกว่า ตัวถัดไป(4) จึงเกิดการสลับกัน

สลับ!!!

โช๊ะ!!!

มาเช็คกันต่อ

ถูกอีกตัวแล้ว
สลับอีกซิ

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

สมบูรณ์แล้ว เย้

มาเขียนโปรแกรมสำหรับ Bubble sort กันเถอะ

ตัวอย่างการเขียนโปรแกรม (สำหรับภาษา C)

จาก code ด้านบนจะเห็นว่าใน function bubble_sort จะมีการวนลูปอยู่ 2 ลูปโดยลูป j จะทำการวนลูปสำหรับ 1 รอบการเรียง โดยมีจุดเริ่มต้นตั้งแต่ตัวแรกจนถึงตัวก่อนสุดท้ายตามขั้นตอนที่ 1–3 และลูป i ก็จะวนขั้นตอนที่ 1–3 จนข้อมูลมีการเรียงกันอย่างสมบูรณ์

ผลลัพธ์ที่ได้จะออกมาเป็น

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

เพื่อน ๆ พี่ ๆ น้อง ๆ ที่อยากจะทราบการทำงานเพิ่มเติมแนะนำให้ลอง แสดงผลการทำงานในแต่ละรอบ โดยสั่ง print ในลูป i เพื่อเพิ่มความเข้าใจได้ครับ

How good is Bubble sort? มันดียังไง

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

Bubble sort จะเป็นวิธีที่มีประสิทธิภาพสูงเมื่อข้อมูลที่เราได้มีการเรียงกันเกือบจะสมบูรณ์แล้ว การสลับกันของข้อมูลจึงต่ำทำให้การทำงานเร็วขึ้น แต่นรกจะเกิดขึ้นเมื่อข้อมูลของเราเรียงกันแบบสลับกันโดยสิ้นเชิง

แย่แน่ๆ

ลองจินตนการดูว่าเรามีข้อมูลที่เราเรียงมากไปน้อย แล้วเราต้องการเรียงจากน้อยไปมากสิ แสดงว่ามันต้องมีการสลับกันทุก ๆ ครั้งแน่นอน ซึ่งจะส่งผลให้จำนวนการทำงานจะเพิ่มขึ้นเป็นเท่าตัวตามจำนวนของข้อมูลหรือประมาณ O(n²) (เดี๋ยวจะอธิบายเพิ่มเติมอีกทีครับ)

ถ้าข้อมูลมีจำนวนน้อยๆก็คงจะไม่มีผลรุนแรง แต่สมมติว่าเราต้องการให้เรียงอายุคนไทยทั้งประเทศด้วย bubble sort คงจะได้ผลอีกทีชาติหน้าแน่นอน

นานมากๆ

เอาให้พอปวดหัวกันเท่านี้ แล้วเราจะมาปวดหัวกันต่อด้วยวิธีอื่นที่ซับซ้อนกว่านี้ในครั้งหน้า

--

--

Ming Ruengjaruwatana

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