โครงสร้างข้อมูล (หน่วยที่ 4 การจัดเรียงและการค้นหาข้อมูล)
อาจารย์เจตวัฒน์ สมเจริญเกียรติ สาขาวิชาคอมพิวเตอร์ธุรกิจ วิทยาลัยเทคโนโลยีวิมลบริหารธุรกิจ
การจัดเรียงและการค้นหาข้อมูล 4.1 การจัดเรียงข้อมูล 4.2 การค้นหาข้อมูล การจัดเรียงข้อมูลคืออะไร การจัดเรียงข้อมูลคือการนาข้อมูลมาทาการเปลี่ยนลาดับ การเก็บโดยใช้เงื่อนไขบางประการในการจัดเก็บเช่น เรียงลาดับจาก น้อยไปมาก หรือจากมากไปน้อย เงื่อนไขในการเรียงลาดับจากน้อย ไปมากคือ x1<=x2<=x3<=... ส่วนจากมากไปน้อยก็ทากลับกันเป็น x1>=x2>=x3>=... จัดเรียงข้อมูลไปทาไม เหตุผลที่จาเป็นต้องจัดเรียงข้อมูลมีมาก เช่น 1. เพื่อจั ดลาดับข้ อมูล ให้เป็ นระเบีย บ ดู ง่ายสบายตา ค้นหา ข้อมูลสะดวก 2. เพื่อใช้ค้นหาข้อมูลด้วยเทคนิคบางประการได้สะดวกขึ้น เช่น ค้นหาแบบ Binary Search Tree หากข้อมูลไม่ เรียงลาดับ แล้วจาไม่สามารถใช้วิธีค้นหาแบบนี้ได้เลย
กลวิธีพื้นฐานในการเรียงลาดับ 1. การสลับตาแหน่ง เป็นการสลับตาแหน่งระหว่างข้อมูลสอง ตัวให้ได้ลาดับที่เหมาะสมจนหมดชุดข้อมูล 2. การเลือก เป็นการมองดูข้อมูลทั้งหมดแล้วเลือกข้อมูลที่มี ค่าที่น้อยที่สุดหรือมากที่สุดออกมาเรียงตามต้องการ 3. การแทรก เป็ น การน าข้ อ มู ล เข้ า ไปแทรกในชุ ด ข้ อ มู ล ที่ เรียงลาดับเอาไว้แล้วในตาแหน่งที่เหมาะสม สิ่งที่ควรพิจารณาในการเลือกวิธีการเรียงลาดับ เนื่อ งจากวิ ธี ก ารเรีย งลาดับ มีม าก บางวิธี ก็เ ป็นวิ ธี ที่ เป็ น ธรรมชาติมากๆ แต่เรียงข้อมูลได้ช้า บางวิธีก็ค่อนข้างพิสดารยากแก่ การเข้าใจ แต่ก็เรียงข้อมูลได้เร็วอย่างไม่น่าเชื่อว่าจะทาได้ ซึ่งวิธีการ เรียงข้ อมูลต่างๆ ล้วนแต่ต้องใช้กลวิธีพื้นฐานการเรียงลาดับที่ได้ กล่าวไว้แล้วทั้งสิ้น แต่ละวิธีต่างกันตรงที่จะนากลวิธีการเรียงมาใช้ อย่ า งไรให้ เ กิ ด ประสิ ท ธิ ภ าพสู ง สุ ด สิ่ ง ที่ ค วรพิ จ ารณาในการ เรียงลาดับได้แก่
1. วิธีการนั้นมีความเร็วสูงสุดในกรณีใด และช้าสุดในกรณีใด 2. วิธีการนั้นมีความเร็วเฉลี่ยเท่าไร 3. ข้อมูลที่ถูกเรียงไว้ดีแล้วจะถูกนามาเรียงใหม่หรือไม่ สรุปได้ว่าสิ่งที่สาคัญที่สุดและน่าสนใจมากที่สุดในการเรียงลาดับ คือ ความเร็วที่ใช้ ซึ่งความเร็วจะน้อยจะมากขึ้นอยู่กับจานวนครั้ง การเปรียบเทียบข้อมูล จานวนครั้งการสลับตาแหน่งข้อมูลการ เรียงลาดับแบบต่างๆ ที่น่าสนใจ **(การเรียงลาดับต่อไปนี้ทุกวิธีจะเรียงข้อมูลจากน้อยไปมาก)**
Bubble Sort จะเปรียบเทียบข้อมูลทีละคู่ไล่กันไปจนจบ ถ้าข้อมูลคู่ใดไม่ เรียงลาดับก็จะนามาสลับกันจนกว่าข้อมูลจะเรียงลาดับทั้งหมด ซึ่ง วิธีนี้เป็นวิธีที่เขียนง่ายที่สุด (ในกรณีนี้ตัวอย่างจะประมวลผลจาก ด้านหลังไปด้านหน้า) ตัวอย่าง : มีข้อมูล ดังนี้ 6 5 2 4 1 3 ครั้งที่ 1 : 1 6 5 2 4 3 ครั้งที่ 2 : 1 2 6 5 3 4 ครั้งที่ 3 : 1 2 3 6 5 4 ครั้งที่ 4 : 1 2 3 4 6 5 ครั้งที่ 5 : 1 2 3 4 5 6 วิเคราะห์ : ถ้ามีข้อมูล n ตัว จะเปรียบเทียบข้อมูล 1/2*n*(n-1) ครั้ง จานวนครั้งในการเปลี่ยนตาแหน่งที่เป็นไปได้คือ 0 ครั้ง (ใน กรณีที่ข้อมูลเรียงอยู่แล้ว) มากที่สุด 3/2*n*(n-1) จานวนครั้งเฉลี่ย เท่ากับ 3/4*n*(n-1) Big(o)=n^2
Shaker Sort เป็นการนา Bubble Sort มาปรับปรุง โดยให้การทางานวิ่ง สองทิศทางไปและกลับ ซึ่งการทางานแบบนี้จะช่วยให้จานวนครั้ง ในการเปรียบเทียบข้อมูลลดลงได้ แต่จานวนครั้งในการสลับ ตาแหน่งข้อมูลทุกอย่างจะเหมือนกับ Bubbles Sort ทุกประการ (การ เรียงใช้แบบการสลับตาแหน่งข้อมูลทีละคู่เหมือนกับ Bubble Sort) ตัวอย่าง : มีข้อมูล ดังนี้ 6 5 2 4 1 3 ครั้งที่ 1 : 1 6 5 2 4 3 (เกิดจากการประมวลผลจากขวาไปซ้าย นาตัวน้อยไปด้านหน้า) ครั้งที่ 2 : 1 5 2 4 3 6 (เกิดจากการประมวลผลจากซ้ายไปขวา นาตัวมากไปด้านหลัง) ครั้งที่ 3 : 1 2 5 3 4 6 (เกิดจากการประมวลผลจากขวาไปซ้าย นาตัวน้อยไปด้านหน้า) ครั้งที่ 4 : 1 2 3 4 5 6 (เกิดจากการประมวลผลจากซ้ายไปขวา นาตัวมากไปด้านหลัง)
Selection Sort เป็นการเรียงลาดับโดยการเลือกข้อมูลที่มีค่าน้อยที่สุดออกมา จากข้อมูล n รายการแล้วนาไปสลับกับข้อมูลตาแหน่งที่ 1หลังจาก นั้นก็เลือกข้อมูลที่มีค่าน้อยที่สุดในข้อมูลที่เหลือ (n-1) แล้วนามา สลับกับข้อมูลตาแหน่งที่ 2 ทาเช่นนี้จนถึงข้อมูลสองตัวสุดท้าย ตัวอย่าง : มีข้อมูล ดังนี้ 6 5 2 4 1 3 ครั้งที่ 1 : 1 5 2 4 6 3 ครั้งที่ 2 : 1 2 5 4 6 3 ครั้งที่ 3 : 1 2 3 4 6 5 ครั้งที่ 4 : 1 2 3 4 5 6 วิเคราะห์ : จานวนครั้งการเปรียบเทียบเป็น 1/2*n*(n-1) การ เปลี่ยนตาแหน่งน้อยที่สุด 3(n-1) ครั้ง การเปลี่ยนตาแหน่งข้อมูลมาก ที่สุด (n^2/4)+3(n-1) การเปลี่ยนตาแหน่งข้อมูลเฉลี่ยเท่ากับ n(ln n+y) : y เป็นค่าคงที่ของออยเลอร์ = 0.577216 ถึงแม้จานวนครั้งการ เปรียบเทียบข้อมูลของแบบ Selection กับแบบ Bubble จะเท่ากัน แต่ จานวนครั้งในการเปลี่ยนข้อมูลของ Selection จะน้อยกว่ามาก
Insertion Sort เป็นการเรียงลาดับโดยเริ่มจากจัดตาแหน่งข้อมูล 2 ตัวแรกก่อน แล้วนาข้อมูลตัวที่ 3 มาเปรียบเทียบกับข้อมูล 2 ตัวแรกแล้วแทรกเข้า ไปในตาแหน่งที่เหมาะสม จากนั้นก็นาข้อมูลตัวที่ 4 มาเปรียบเทียบ กับข้อมูล 3 ตัวแรกแล้วนาไปแทรกในตาแหน่งที่เหมาะสม ทาเช่นนี้ จนหมดชุดข้อมูล ตัวอย่าง : มีข้อมูล ดังนี้ 6 5 2 4 1 3 ครั้งที่ 1 : 5 6 2 4 1 3 ครั้งที่ 2 : 2 5 6 4 1 3 ครั้งที่ 3 : 2 4 5 6 1 3 ครั้งที่ 4 : 1 2 4 5 6 3 ครั้งที่ 5 : 1 2 3 4 5 6 วิเคราะห์ : จานวนครั้งการเปรียบเทียบน้อยที่สุดเป็น n-1 (เกิด เมื่อข้อมูลจัดเรียงอยู่แล้ว) เปรียบเทียบข้อมูลมากที่สุด เป็น [1/2*n*(n-1)]-1 ครั้ง เฉลี่ยเท่ากับ 1/4(n+2)(n-1) จานวนครั้งการ เปลี่ยนตาแหน่งข้อมูลน้อยที่สุดเป็น 2(n-1) มากที่สุดเป็น 1/2(n+4)(n-1) ค่าเฉลี่ยเท่ากับ 1/4(n+10)(n-1)
Shell Sort เป็น การเรีย งล าดั บโดยเริ่ มจากจั ดต าแหน่ งข้ อมู ลแต่ล ะ ตาแหน่งกับตาแหน่งถัดไป 3 ตาแหน่ง หลังจากนั้นก็จัดตาแหน่ง ข้ อ มู ล แต่ ล ะต าแหน่ ง กั บ ข้ อ มู ล ที่ อ ยู่ ถั ด ไป 2 ต าแหน่ ง สุ ด ท้ า ยก็ จัดลาดับข้อมูลที่อยู่ติดกัน ตัวอย่าง : มีข้อมูล ดังนี้ 6 5 2 4 1 3 ครั้งที่ 1 : 4 5 2 6 1 3 (จัดกับตาแหน่งถัดไปที่ 3 ) ครั้งที่ 2 : 4 1 2 6 5 3 ครั้งที่ 3 : 2 1 4 6 5 3 (จัดกับตาแหน่งถัดไปที่ 2) ครั้งที่ 4 : 2 1 4 3 5 6 ครั้งที่ 5 : 1 2 3 4 5 6 (จัดกับตาแหน่งถัดไปที่ 1) วิเคราะห์ : ตาแหน่งหลักข้อมูลถัดไปที่ใช้เปรียบเทียบ ตัวอย่างใช้ 3,2,1 สามารถเปลี่ยนได้ตามความเหมาะสม แต่ตัวสุดต้องเป็น 1 เสมอ และไม่ จาเป็นต้องใช้เพียง 3 แบบอาจเพิ่มมากกว่านี้ได้ ถ้าข้อมูลมีจานวนมาก จานวน ครั้งการเปรียบเทียบและการเปลี่ยนตาแหน่งข้อมูลไม่สามารถบอกได้แน่นอน ว่าเป็นเท่าใดเพราะขึ้นอยู่กับจานวนหลักที่ใช้ในการเปรียบเทียบ และระยะห่าง ของแต่ละหลักที่ใช้เปรียบเทียบ แต่สามารถพิสูจน์ทางคณิตศาตร์ได้ว่าจานวน ครั้ ง การท างานจะแปรผั น ตาม รากที่ ส องของจ านวนข้ อ มู ล ดั ง สมการ t=kn^(1/2)+c
Quick Sort เป็นการเรียงลาดับที่ดีที่สุดในปัจจุบัน หลักการเรียงลาดับ แบบ Quick ปรับปรุงมาจากการเรียงลาดับแบบสลับตาแหน่งข้อมูล ซึ่งเป็นวิธีที่ด้อยประสิทธิภาพมากที่สุด แต่พอปรับปรุงการทางาน เป็นแบบ Quick Sort แล้วกลับมีประสิทธิภาพที่สุด อย่างน่าอัศจรรย์ หลักการมีดังนี้ เลือกข้อมูลมาหนึ่งตั วใช้เป็นตัวเปรียบเทียบ ตัวที่ เลือกขึ้นมาไม่ควรเป็นตัวที่มีค่ามาก เพราะจะทาให้การเรียงลาดับช้า ลงได้ แล้วนาข้อมูลตัวนั้นมาแบ่งกลุ่ม โดยให้ข้อมูลตัวที่น้อยกว่ามัน ไปอยู่ทางซ้ายข้อมูลที่มากกว่าไปอยู่ทางขวา เมื่อแบ่งข้อมูลเป็นสอง ข้างแล้วก็ทากับแต่ละข้างแบบเดิม (ข้อมูลที่ใช้เปรียบเทียบตอนแรก ก็ไม่ต้องไปสนใจ) ตัวอย่าง : มีข้อมูล ดังนี้ 6 5 2 4 1 3 (โปรแกรมสุ่มเลือก 3 เป็นตัวเปรียบเทียบ) ครั้งที่ 1 : 2 1 3 6 5 4 (ใช้ 3 แบ่งกลุ่มเป็นสองข้าง ทางซ้ายเลือก 2 มา เป็นตัวเปรียบเทียบ โดยการสุ่มเลือก) ครั้งที่ 2 : 1 2 3 6 5 4 (ทางขวา เลือก 4 มาเป็นตัวเปรียบเทียบ โดย การสุ่มเลือก) ครั้งที่ 3 : 1 2 3 4 6 5 (ข้อมูลชุด 6 5 สุ่มเลือก 6 มาเป็นตัว เปรียบเทียบ)
ครั้งที่ 4 : 1 2 3 4 5 6 วิเคราะห์ : ก็ไม่สามารถหาจานวนครั้งเปรียบเทียบและจานวนครั้ง การสลับตาแหน่งข้อมูลที่แน่นอนได้ เพราะขึ้นอยู่กับว่าโปรแกรมจะ เลือกค่าใดมาเป็นตัวเปรียบเทียบในการแบ่งกลุ่ม แต่สามารถพิสูจน์ ทางคณิตศาสตร์ได้ว่าจานวนครั้งการเปรียบเทียบข้อมูลจะแปรผัน ตาม n log n และมีการเปลี่ยนตาแหน่งข้อมูลจะแปรผันตาม n/6 log nโปรแกรมเรียงข้อมูลแบบเป็นรูปธรรม Visual Sort