Page 1

!"!

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา นายพงษวุฒิ ดวงศรี รายละเอียดของเนือ้ หา ตอนที่ 8.1 การเรียงลําดับขอมูล (1 คาบ) เรือ่ งที่ 8.1.1

ปจจัยที่มีผลตอการเรียงลําดับขอมูล

เรือ่ งที่ 8.1.2

ฟงกชัน Big O สําหรับการเรียงลําดับขอมูลแบบ Selection Sort

ตอนที่ 8.2 การเรียงลําดับขอมูลแบบตาง (2 คาบ) เรือ่ งที่ 8.2.1

การเรียงลําดับขอมูลในลักษณะ O(N2)

เรือ่ งที่ 8.2.2

การเรียงลําดับขอมูลในลักษณะพิเศษ

แนวคิด 1. 2. 3. 4. 5.

การเรียงลําดับขอมูลเปนขบวนการทีส่ าํ คัญ และใชมากในการประมวลผลขอมูล เวลาที่ใชในการเรียงลําดับขอมูลขึ้นอยูกับ จํานวนขอมูล ขัน้ ตอนในการเรียง และ ฮารดแวร สําหรับในบทนีข้ อเสนอ ขัน้ ตอนในการเรียงลําดับขอมูล โดยเฉพาะ นําเสนอ การเปรียบเทียบคาของ ฟงกชันจํานวนการเปรียบเทียบ กับจํานวนขอมูล นําเสนอแนะการเรียงลําดับขอมูลดวยวิธกี ารตาง ๆ

วัตถุประสงค หลังจากศึกษาบทเรียน นักศึกษาสามารถ 1. อธิบายฟงกชัน Big O(N2) สําหรับการเรียงลําดับขอมูลได 2. อธิบายลักษณะการเรียงลําดับขอมูลแบบฟงกชัน Big O(N2) ได 3. เขียนขัน้ ตอนการดําเนินงาน สําหรับการเรียงลําดับขอมูลในลักษณะตางๆ ตามที่กําหนดให 4. นําไปประยุกต เขียนโปรแกรมสําหรับการเรียงลําดับขอมูลในลักษณะตางๆ ตามที่กําหนดให กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 8.1 และตอนที่ 8.2


!"# 2. ทํากิจกรรมของบทเรียนที่ 8 3. ทําแบบประเมินผลของบทเรียนที่ 8 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน


!"" ตอนที่ 8.1 การเรียงลําดับขอมูล หัวเรื่อง เรือ่ งที่ 8.1.1 ปจจัยที่มีผลตอการเรียงลําดับขอมูล เรือ่ งที่ 8.1.2 ฟงกชัน Big O สําหรับการเรียงลําดับขอมูลแบบ Selection Sort แนวคิด 1. เวลาสําหรับการเรียงลําดับขอมูลขึน้ อยูก บั จํานวนขอมูล ขัน้ ตอนในการเรียงลําดับ และ ฮารดแวร ในที่นี้จะสนใจเฉพาะ ขัน้ ตอนการเรียงลําดับขอมูล 2. นําเสนอการหาฟงกชนั จํานวนการเปรียบเทียบขอมูลระหวางการเรียง กับจํานวนขอมูล 3. การเรียงลําดับขอมูลแบบ Selection Sort เปนไปตามฟงกชัน Big O(N2) วัตถุประสงค หลังจากที่ศึกษาตอนที่ 8.1 แลว นักศึกษาสามารถ 1. อธิบายปจจัยที่มีผลตอการเรียงลําดับขอมูลได 2. อธิบายความหมายของฟงกชัน Big O ได 3. แสดงขั้นตอนการหาฟงกชัน Big O สําหรับการเรียงลําดับขอมูลแบบ Selection Sort 4. เขียนขั้นตอนการเรียงลําดับขอมูลแบบ Selection Sort ได 5. เขียนตําแหนงและลักษณะการยายขอมูล ระหวางการเรียงลําดับขอมูลแบบ Selection Sort ได เรื่องที่ 8.1.1 ปจจัยที่มีผลตอการเรียงลําดับขอมูล การเรียงลําดับขอมูล (Sorting) เปนเทคนิคทีส่ าํ คัญอยางหนึง่ ในกระบวนการประมวลผลขอมูล ไมวา จะเปนการดําเนินงานทางดานธุรกิจ วิทยาศาสตร หรือ สังคมศาสตร ก็ตาม ขอมูลที่มีการเรียงกันเปน ทีเ่ รียบรอย ยอมเปนระเบียบ และงายตอการคนหา เชน ระเบียนคนไขของโรงพยาบาล หรือรายชื่อหนังสือ ในหอสมุด หากขอมูลไมมีการเรียงกันเลย การคนหาขอมูลจะยากลําบากและตองใชเวลามากหรืออาจไม สามารถคนหาไดเลย การเรียงลําดับขอมูลจะประสบความสําเร็จรวดเร็วแคไหน ขึ้นอยูกับปจจัย 3 ประการ ปจจัยประ การ แรกขึ้นอยูกับฮารดแวร ฮารดแวรที่มีความไวกวายอมทํางานไดเร็วกวาแนนอน ซึ่งเราจะไมสนใจปจจัยนี้ เพราะไมใชวิธีการแกปญหา ทีด่ ที ส่ี ดุ ปจจัยที่สอง ขึ้นอยูกับจํานวนหรือขนาดของขอมูล ถาขอมูลมีเปน จํานวนมาก การเรียงลําดับขอมูลก็ยอ มเสียเวลาเพิม่ ขึน้ เปนธรรมดา แตการเสียเวลาทีเ่ พิม่ ขึน้ นัน้ เพิ่มขึ้น อยางไร ? มีความสัมพันธอยางไรกับจํานวนขอมูลและสัมพันธในลักษณะไหน สมมุติให N เปนจํานวนขอมูล เวลาที่ใชในการเรียงลําดับขอมูล เปนสัดสวนโดยตรงกับ N2 หรือที่เรียกวา Big O(N2) หมายความวา เวลาที่ใชในการเรียงลําดับขอมูลจะมากขึ้น ในลักษณะ กราฟพาราโบลา (Parabola) ซึง่ จะมีการเปลีย่ นแปลง


!"$ เร็วมาก โดยจะแปรงผันเปนกําลังสอง เชน ถา N=10, N2 จะเปน 100 แตถา N=100, N2 จะเปน 10000. หรือถาเวลาในการเรียงลําดับขอมูลขึ้นอยูกับจํานวนขอมูล ในลักษณะ Big O(Nlog2N) หมายความวาจะมี ความ สัมพันธในลักษณะ N คูณ log2N ซึง่ การเพิม่ เวลา ในการเรียงลําดับขอมูล จะชากวาวิธีแรก แนนอน ความสัมพันธที่กลาวมาขางตน จะขึ้นอยูกับวิธีการในการเรียงลําดับขอมูล ซึ่งถือวาเปนปจจัยที่สาน และเปนปจจัย ที่มีความสําคัญยิ่ง ในการเรียงลําดับขอมูล อยางมีประสิทธิภาพ ที่เราจะตองศึกษาคนควา และเปนปจจัยที่เราใหความสนในที่สุด เพราะเปนวิธี ที่ขึ้นอยูกับความสามารถ ของนักโปรแกรม โดยตรง สําหรับในบทนี้ เราจะกลาวถึงการเรียงลําดับขอมูลในลักษณะ Big O(N2) และบางวิธี ที่คิดวาจะเปน ประโยชนตอผูเรียนโดยตรง วิธกี ารเรียงลําดับขอมูลในลักษณะ Big O(N2) แมจะเรียงไดชากวา การเรียง ลําดับขอมูลในลักษณะวิธกี ารอืน่ แตในขอเท็จจริง วิธกี ารนีก้ ไ็ มเลวนักและถือวาเปนวิธที ด่ี เี ลยทีเ่ ดียว สําหรับบางกรณี เชน ถาขอมูลไมมากมายมหาศาล ยิ่งในปจจุบัน ฮารดแวร มีความสามารถรวดเร็ว ยิ่ง การประมวลผลแทบไมมีความแตกแตงกัน การเรียงวิธีนี้ถึงจะชากวา แตถาขอมูลอยูในลักษณะที่ ใกล จะเรียงกัน หรือเรียงกันแลว วิธีนี้ยังสามารถตรวจสอบ และจบการทํางานกอนเวลา ไมเหมือนกับบางวิธีที่ ถือวาเร็วกวา แมขอมูลที่เรียงกันแลวก็ไมสามารถตรวจสอบไดและจะตั้งหนาตั้งตาเรียงใหมตลอดเวลา ที่ สําคัญอีกประการวิธกี ารนี้ งาย และสัน้ ในการเขียนโปรแกรม สําหรับวิธีการเรียงลําดับขอมูล ที่คุนเคยและถือวางายที่สุด คือการเรียงลําดับขอมูลแบบ Selection Sort ซึ่งเราจะใชวิธีการเรียงลําดับขอมูลวิธีนี้ เพื่อศึกษาความสัมพันธระหวาง เวลาในการเรียง ลําดับขอมูล กับจํานวนขอมูล ในลักษณะฟงกชัน Big O(N2) Selection Sort ดังไดกลาวมาแลว การเรียงลําดับขอมูลวิธนี เ้ี ปนวิธที ง่ี า ยและสัน้ ทีส่ ดุ แตก็เปนวิธีที่ ทํางานมากที่สุด ดังนั้นหากมีขอมูลเปนจํานวนมาก การเรียงลําดับขอมูลดวยวิธีนี้ก็จะไมเหมาะสมมากนัก สําหรับขัน้ ตอนการดําเนินงานมีดงั นี้ 6. เริม่ จากการนํา คาแรก มาเทียบกับคาที่สองของแถวลําดับ ถาคาแรก มีคา นอยกวาคาทีส่ อง จะทําการสลับคาทัง้ สอง (สําหรับการเรียงลําดับขอมูลจากมากไปนอย) เชน ในบรรทัดที่ 1 และ 2 ของ ตัวอยางขางลาง ในกรณีที่ตองการเรียงลําดับขอมูลจากนอยไปหามาก ให เปลีย่ นเงือ่ นไข โดยใหคาแรกมากกวาคาที่สอง จึงทําการสลับคากัน, ทําเชนนีไ้ ปเรือ่ ยๆ โดย การนําคาแรก มาเทียบกับคาที่สาม , คาทีส่ ,่ี . . . , คาสุดทาย เพื่อยายคาที่มีคามากที่สุดมา อยู ณ ตําแหนงแรก ของแถวลําดับ และเมือ่ สิน้ สุดก็ถอื วาคาแรก เปนคาที่เรียงแลวในแถว ลําดับ ดังบรรทัดที่ 2-4 ของตัวอยาง 7. ดําเนินการเชนเดียวกับขอ 1. โดยการนําคาทีส่ อง มาเทียบกับคาถัดไปจนครบทุกคาของแถว ลําดับ เพือ่ ยายขอมูลทีม่ คี า มากทีส่ ดุ เปนลําดับสอง มาอยู ณ ตําแหนงที่สองของแถวลําดับ เชน ในบรรทัดที่ 5 ถึงที่ 7 ของตัวอยาง 8. ดําเนินการเชนเดียวกับขอ 1. กับคาทีส่ าม, คาทีส่ ่ี ไปเรือ่ ยๆ จนถึง คารองสุดทาย ของแถว ลําดับ ซึ่งในที่สุดจะไดชุดขอมูลในแถวลําดับที่เรียงกันตามความตองการ Ex ขอมูลที่จัดเก็บในแถวลําดับมีดังนี้ 8, 20, 30, 3, 4 จงเรียงลําดับขอมูลจากมากไปนอย


!"% กําหนดให i : เปนตัวแปรเก็บดัชนีของคาที่ตองการเรียง j : เปนตัวแปรเก็บดัชนีของคาที่จะนํามาเปรียบเทียบกับคาที่ตองการเรียง 1) i=1, j=2

8

20

30

3

4

2)

20

8

30

3

4

3)

30

8

20

3

4

4)

30

8

20

3

4

5) i=2, j=3

30

8

20

3

4

6)

30

20

8

3

4

7)

30

20

8

3

4

8) i=3, j=4

30

20

8

3

4

9)

30

20

8

3

4

10) i=4, j=5

30

20

8

3

4

11)

30

20

8

4

3

Algorithm (การเรียงลําดับขอมูลจากนอยไปมาก) กําหนดให

Max : เปนตัวแปรเก็บจํานวนขอมูลทั้งหมด A[Max] : เปนตัวแปรเก็บขอมูลในแถวลําดับ

Procedure

SelectionSort(Var : A[Max]) Begin For (I := 1 to Max-1)

Do

Begin For (J := I+1 to Max) If(A[I] > A[J])

Do Then

Swape(A[I],A[J]); End; End.

จากตังอยางที่กลาวมาขางตน ถาขอมูลที่นํามาเปรียบเทียบไมอยูในตําแหนงที่ถูกตอง จะทําการ สลับคาทันทีทกุ ครัง้ ซึง่ การสลับคา แตละครั้ง จําเปนตองใช คําสัง่ ถึง 3 คําสัง่ ปญหานีส้ ามารถลดขัน้ ตอนลง ได โดยการเก็บดัชนี (Index) ของคาทีต่ อ งการสลับไว แทนที่จะสลับคาทันที โดยเริ่มตนใหเก็บดัชนีของคาที่ ตองการจะเรียงไวกอน และเมื่อเปรียบเทียบครั้งตอไป ก็ใหเอาคาในดัชนี ที่เก็บไว มาเปรียบเทียบกับคาถัด ไป ถาไมอยูในตําแหนงที่ถูกตองใหเก็บคาดัชนีนี้แทน ทําเชนนีไ้ ปเรือ่ ย ๆ จนครบทุกคา สุดทายจึงตรวดดู วา คาที่ตองการจะเรียงมี ดัชนี ตรงกับดัชนีที่เก็บไวในตอนแรกหรือไม ถาไมตรงกันจึงทําการสลับคาทัง้ สอง ซึง่ จะเห็นวาสลับคาเพียงครัง้ เดียว


!"& Algorithm (การเรียงลําดับขอมูลจากนอยไปมาก) Procedure

SelectionSort(Var : A[Max]) Begin For (I := 1 to Max-1) Do Begin Target := I; For (J := I+1 to Max) Do If (A[Target] > A[J]) Target := J; If (I ≠ Target)

Then

Then Swape(A[I],A[Target]); End;

End.

เรื่องที่ 8.1.2 ฟงกชัน Big O สําหรับการเรียงลําดับขอมูลแบบ Selection Sort จากตัวอยางขางตน จะเห็นวา ถาดัชนี I = 1 จะตองทําการเปรียบเทียบกับขอมูลที่เหลือทุกคา ดัง นั้นถามีขอมูลจํานวน N คาก็จะตองเปรียบเทียบถึง N–1 ครัง้ ทํานองเดียวกัน ถาดัชนี I = 2 ก็จะตองทําการ เปรียบเทียบกับขอมูลที่เหลือ N–2 คา และถาดําเนินการเปรียบเทียบไปเรือ่ ย ๆ จนถึงคารองสุดทาย I = N1 การเปรียบเทียบจะทําการเพียงครั้งเดียว คือคาที่ N ซึง่ ทัง้ หมดสรุปไดดงั นี้ ถา

I=1 I=2 I=3 o o o I = N-1

จะทําการเปรียบเทียบ จะทําการเปรียบเทียบ จะทําการเปรียบเทียบ “ “

N–1 ครัง้ N–2 ครัง้ N–3 ครัง้ o o o N– (N-I) ครัง้

ดังนั้นจํานวนครั้งเปรียบเทียบทั้งหมด = (N-1) + (N-2) + (N-3) + o o o + 1 จํานวนครั้งเปรียบเทียบทั้งหมด = ((N-1)+1)(N-1)/2 = (N-1)N/2 =N2/2 - N/2


!"' ลักษณะของกราฟพาราโบรา (Parabola) จะเห็นวาพจน ทีม่ ผี ลมากทีส่ ดุ สําหรับการเรียงในวิธกี ารนีค้ อื N2 ดังนัน้ ในทาง Computer เราจะสน ใจเฉพาะลําดับกําลังสอง (Order N2) หรือเขียนในสัญญาลักษณของ Big O(N2) หรือ O(2) ซึง่ ลักษณะนี้ เปนไปตามสมการพาราโบลา ลักษณะของกราฟนี้ จะมีการเปลี่ยนแปลงอยางรวดเร็วเมื่อคา N เพิ่มขึ้น กิจกรรม 8.1 1. จงเขียน โมดูล (Module) เพือ่ ทําการรับคา เก็บในตัวแปร แถวลําดับ A[Max] โดย Max คือจํานวนขอมูลมากที่สุด ที่จะรับไดในแถวลําดับนี้ ในตอนแรกใหรับจํานวนขอมูลที่จะรับเขามาซึ่งจะ มีคาไมมากเกินกวาคา Max จากนั้นจึงวนรับคาจนกวาจะครบ 2. จงแสดงใหเห็นวาการเรียงลําดับขอมูลแบบ Selection Sort เปนการเรียงลําดับขอมูลในลักษณะ Big O(N2) 3. จงเขียนโมดูล สําหรับการเรียงลําดับขอมูลจากมากไปหานอย แบบ Selection Sort 4. จงแสดงลักษณะและตําแหนงของขอมูล ระหวางการเรียงลําดับขอมูลจากนอยไปหามาก แบบ Selection Sort โดยชุดขอมูลมีดังนี้ 4.1. 2, 1, 8, 4, 3, 9, 6, 0, 7, 5 4.2. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9


!"( ตอนที่ 8.2 การเรียงลําดับขอมูลแบบตาง หัวเรื่อง เรือ่ งที่ 8.2.1

การเรียงลําดับขอมูลในลักษณะ O(N2)

เรือ่ งที่ 8.2.2

การเรียงลําดับขอมูลในลักษณะพิเศษ

แนวคิด 1. นําเสนอการเรียงลําดับขอมูลในลักษณะ O(N2) แบบ Bubble Sort, Insertion Sort, Shell Sort 2. นําเสนอการเรียงลําดับขอมูลในลักษณะพิเศษ สําหรับกรณีที่มีขอมูลจํานวนมาก ๆ ดวยวิธี Merge Sort, External Sort 3. การเรียงลําดับขอมูลทีเ่ ปนตัวเลข แบบ Bucket Sort สามารถเรียงไดโดยตรง โดยจัดเก็บใน ตําแหนงที่ตรงกับคานั้น ๆ วัตถุประสงค หลังจากที่ศึกษาตอนที่ 8.2 แลว นักศึกษาสามารถ 1. เขียนขัน้ ตอนการเรียงลําดับขอมูลในลักษณะ O(N2) แบบ Bubble Sort, Insertion Sort, Shell Sort ได 2. เขียนขั้นตอนการแบงแฟมขอมูลหลักเปนแฟมขอมูลยอย ๆ ได 3. เขียนขัน้ ตอนการเรียงลําดับขอมูลในลักษณะพิเศษ แบบ Bucket Sort, Merge Sort, External Sort ได 4. อธิบายความแตกตางระหวาง การเรียบลําดับขอมูลในลักษณะ O(N2) กับลักษณะพิเศษได 5. เขียนตําแหนง และลักษณะการยายขอมูล ระหวางการเรียงลําดับขอมูลแบบตางๆ ตามไดรับ มอบหมายได เรื่องที่ 8.2.1 การเรียงลําดับขอมูลในลักษณะ O(N2) ตามที่กลาวมาในตอนที่แลว การเรียงลําดับขอมูลขึ้นอยูกับปจจัยหลายประการ เชน จํานวนขอมูล ที่จะเรียง หรือ วิธใี นการเรียงลําดับขอมูล เปนตน นอกจากนีย้ งั ทราบวาการเรียงลําดับขอมูลสําหรับกรณี ศึกษานี้ เปนไปตามลักษณะ Big O(N2) ซึ่งหมายความวา การเรียงลําดับขอมูลขึน้ อยูก บั กําลังสองของ จํานวนขอมูล การเรียงลําดับขอมูลในลักษณะ Big O(N2) มีหลายวิธี ที่ยกมาเปนเพียงบางวิธี ซึง่ ถาสน ใจสามารถ ศึกษาเพิ่มเติมจากหนังสือโครงสรางขอมูลทั่ว ๆ ไปได


!") Bubble Sort เปนการเรียงลําดับขอมูลในสัญญาลักษณ Big O(N2) เชนเดียวกับการเรียงลําดับขอมูลแบบ Selection Sort และยังมีลกั ษณะการเรียงทีค่ ลายกัน กลาวคือจะหาคาที่ตองการเรียง มาที่ละคา โดยจะเริ่ม ที่ตําแหนงแรก หรือตําแหนงสุดทายของแถวลําดับก็ได สิ่งที่แตกตางสําหรับการเรียงแบบ Bubble Sort คือจะไมนําคาที่ตองการเรียงมาเทียบกับทุกคาเหมือน Selection Sort แตจะเปรียบเทียบกับคาถัดไปที่ละคูไป เรือ่ ยๆ เพือ่ ดันคาทีต่ อ งการมาดานหนาหรือดานหลัง ขัน้ ตอนการเรียงลําดับขอมูลมีดงั นี้ 1. เริม่ จากการนําคาแรก มาเปรียบเทียบกับคาถัดไป ซึง่ ก็คอื คาทีส่ องในแถวลําดับ ถาไมตรง ตามจุดประสงคจะทําการสลับคาทัง้ สอง จากนั้นขยับมาเปรียบเทียบ ระหวางคา ที่ 2 และที่ 3 เชนใน บรรทัดที่ 1-2 ของตัวอยาง ทําเชนนีไ้ ปเรือ่ ยๆ จนกวาจะถึงคาสุดทาย ก็จะไดคาที่เรียง แลวคาแรกอยู ณ ตําแหนงสุดทายของ แถวลําดับ 2. ดําเนินการเชนเดียวกับขอ 1. โดยเริ่มตน จากการเปรียบเทียบ คาที่ 2 กับ คาที่ 3 และ เปรียบเทียบ ทีละคูไ ปเรือ่ ย ๆ จนถึงคา รองสุดทาย ก็จะไดคาที่เรียงแลว คาที่ 2 อยู ณ ตําแหนงรองสุดทาย ของแถวลําดับ เชน บรรทัดที่ 6-9 ของตัวอยาง 3. ดําเนินการเชนเดียวกับขอ 1. จนครบทุกคา ก็จะไดแถวลําดับที่เรียงตามความประสงค Ex จากขอมูล 8, 20, 30, 3, 4 จงเรียงลําดับขอมูลจากนอยไปหามาก 1) i=1, j=2

8

20

30

3

4

2)

8

20

30

3

4

3)

8

20

30

3

4

4)

8

20

3

30

4

5)

8

20

3

4

30

6) i=1, j=2

8

20

3

4

30

7)

8

20

4

3

30

8)

8

3

20

4

30

9)

8

3

4

20

30

10) i=1, j=2

8

3

4

20

30

11)

3

8

4

20

30

12)

3

4

8

20

30

13) i=1, j=2

3

4

8

20

30

14) ผลลัพธ

3

4

8

20

30


!$* Algorithm

(การเรียงลําดับขอมูลจากนอยไปมาก)

Procedure

BubbleSort(Var : A[Max]) Begin For (I := Max-1 Downto 1) Do Begin For (J := 1 to I) Do If(A[J] > A[J+1]) Swape(A[J],A[J+1]); End; End.

BubbleSort(Var : A[Max]) Begin For (I := 2 to Max) Do Begin For (J := Max Downto I) If(A[J-1] > A[J]) Swape(A[J],A[J-1]); End; End.

Then

Procedure

Do Then

จะเห็นวาการเรียงลําดับขอมูลในลักษณะนีเ้ ปนการเรียงแบบO(N2) ซึ่งไมวาการเรียงลําดับขอมูลจะ ดันมาดานหนาหรือดานหลัง ผลออกมาไมแตกตางกัน สิง่ ทีส่ าํ คัญทีส่ ดุ และถือวาการเรียงลําดับวิธนี ม้ี ปี ระ สิทธิภาพเหนือวิธีอื่นคือสามารถตรวจสอบขอมูลวามีการเรียงลําดับแลวหรือยัง ถาขอมูลมีการเรียงกันเปนที่ เรียบรอยก็สามารถจบการทํางานกอนกําหนดได (การเรียงลําดับขอมูล แบบมีการตรวจสอบการเรียงของขอมูล) Procedure BubbleSort(Var : A[Max]) Begin N := Max –1; Sort := ‘Y’; While (N> 0 AND Sort =’Y’) Do Begin Sort := ‘N’; For (J := 1 to N) Do Begin If(A[J] > A[J+1]) Then Begin Swape(A[J],A[J+1]); Sort := ‘Y’; End; End; N := N –1; End;


!$! End.

Insertion Sort เปนวิธีการเรียงลําดับขอมูลโดยการยายคาและแทรกลงในตําแหนงที่เหมาะสม ซึ่งจะเริ่มตน จาก สวนหนาแลวขยายไปที่ละคาจนครบทุกคาในแถวลําดับขอมูล ขัน้ ตอนการเรียงลําดับขอมูลมีดงั นี้ 1. เริ่มจากการนําขอมูลคาที่ 2 มาเปรียบเทียบกับคาแรกในแถวลําดับ ถาไมเปนไปตามจุด ประสงค ก็ทาํ การสลับคากัน 2. นําขอมูลคาที่ 3 มาเปรียบเทียบกับคาแรก ถาไมเปนไปตามจุดประสงค ใหเก็บคาที่ 3 ไว แลวทําการเลือ่ นขอมูล คาที่ 1, คาที่ 2 ขึ้นมาหนึ่งลําดับ ใหมาอยู ณ ตําแหนง ที่ 2 และ 3 ตามลําดับ จากนั้นจึงนําคาที่ 3 ทีเ่ ก็บไวกอ นหนานี้ มาจัดเก็บลงในตําแหนงที่ 1 ขัน้ ตอนการ เรียง คาที่ 3. ถือวาสําเร็จสมบูรณ ดังเชนในตัวอยาง บรรทัดที่ 2–5, แตถาการเปรียบเทียบ ถูกตองตามความตองการ ใหนําขอมูลคาที่ 3 มาเปรียบเทียบกับคาที่ 2 แลวดําเนินงาน ตาม ขั้นตอนขางตนตอไป 3. ดําเนินงานเชนเดียวกับขอ 2. กับคาที่ 4, ที่ 5, . . . จนครบทุกคา สุดทายจะไดแถวลําดับที่เรียง กันตามความตองการ ดังตัวอยางขางลาง

Ex จากขอมูล 8, 20, 6, 15, 4 จงเรียงลําดับขอมูลจากนอยไปหามาก 1) I=2, j=1

8

20

6

15

4

2) I=3, j=1

8

20

6

15

4

3)

8

20

20

15

4

4)

8

8

20

15

4

5) I=4, j=1

6

8

20

15

4

6) I=5, j=1

6

8

15

20

4

7)

6

8

15

20

20

8)

6

8

15

15

20

9)

6

8

8

15

20

10)

6

8

8

15

20

11)

6

6

8

15

20

12)

4

6

8

15

20


!$# Algorithm (การเรียงลําดับขอมูลจากนอยไปมาก) A[I] : คือคาทีต่ อ งการเรียง

กําหนดให

A[J] : คือคาที่จะนํามาเปรียบเทียบกับคาที่ตองการเรียง Procedure

Insertion_Sort (Var : A[Max]) Begin For (I := 2 to Max) Do Begin J := 1; flag := ‘Y’; While (J<I AND flag = ‘Y’) Do Begin If(A[I] < A[J]) Then Begin temp := A[I]; For (n := I downto J+1) Do A[n] := A[n-1]; A[J] := temp; flag := ‘N’; End; J := J+1; End; End; End.

Shell Sort เนือ่ งจากการเรียงลําดับขอมูลแบบ O(Nlog2N) แมจะมีความสามารถในการดําเนินงานไดเร็วกวา แตก็มีความยุงอยากพิศดารมากกวาแบบ O(N2) แตถาขอมูลไมมากนัก หรือขอมูลใกลจะเรียงกันอยูแลว การเรียงแบบ O(N2) ก็จะมีประสิทธิภาพไมดอยไปกวาแบบ O(Nlog2N) แถมยังงายกวามาก ดังนัน้ Shell Sort จึงเปนทางออกสําหรับการแกปญ  หาเหลานี้ การเรียงลําดับขอมูลแบบ Shell Sort ก็เหมือนการเรียง ลําดับแบบ O(N2) ทั่วๆไป ตางกันตรงที่พยายามแบงขอมูลออกเปนสวนๆ แลวจึงเรียงลําดับขอมูลเฉพาะใน สวนนัน้ ๆ กอน จากนั้นจึงทําการแบงขอมูลเปนสวนยอยๆแตใหมีขนาดที่ใหญขึ้นแลวทําการเรียงลําดับอีก จุดประสงคเพื่อใหเปนไปตาม คุณลักษณะเดนของการเรียงแบบ O(N2) นัน้ เอง สําหรับขนาดของกลุม ยอย หรือชวงของขอมูลที่จะแบง ใหขึ้นอยูกับดุลพินิจของผูดําเนินงาน แตกไ็ มควรเล็กเกินไป มิเชนนัน้ จะกลาย เปน Selection หรือ Bubble Sort ในที่นี้จะใหจํานวนขอมูลแตละชวงเปนไปดังนี้ Pir1 = 1, Piri+1 = 3 Piri + 1; ดังนัน้ Piri จะมีคา : 1, 4, 13, 40, o o o


!$" Ex จากขอมูล 27, 80, 2, 46, 16, 12, 54, 64, 22, 17, 66, 37, 35 จงเรียงลําดับขอมูลจากนอยไปหามาก 1) ชวง=5 27 80 2 46 16 12 54 64 22 17 66 37 35 2)

12 80 2 46 16 27 54 64 22 17 66 37 35

3)

12 37 2 46 16 27 54 64 22 17 66 80 35

4)

12 37 2 46 16 27 54 35 22 17 66 80 64

5)

12 37 2 22 16 27 54 35 46 17 66 80 64

6) ชวง=2

12 37 2 22 16 27 54 35 46 17 66 80

7)

2 37 12 22 16 27 46 35 54 17 64 80 66

8) ชวง=1

2 17 12 22 16 27 46 35 54 37 64 80 66

9)

2 12 16 17 22 27 35 37 46 54 64 66 80

Algorithm กําหนดให

(การเรียงลําดับขอมูลจากนอยไปมาก) Pir : ตัวแปรเก็บชวงความหางของขอมูล Leng : ตัวแปรเก็บจํานวนครั้งที่จะทําซ้ําสําหรับชวงขอมูลนั้น

การเรียงลําดับขอมูลในกลุมยอยจะเรียงแบบ Bubble Sort

64


!$$ Procedure

Shell_Sort (Var : A[Max]) Begin Pir := Max; Do Begin Leng := Pir := Pir /3; For (I:=1 to Leng) Do Begin Sort := ‘Y’; n := Max – Leng; While(n>1 && Sort=’Y’) Do Begin Sort := ‘N’; For(J:=I to n Step Leng) Do Begin If(A[J] > A[J+Leng]) Begin Swape(A[J],A[J+Leng]);

Then

Sort := ‘Y’; End; End; n := n – Leng; End; End; End; While(Pir > 0); End.

เรื่องที่ 8.2.2 การเรียงลําดับขอมูลในลักษณะพิเศษ Bucket Sort การเรียงลําดับขอมูลดวยวิธีนี้ ไมใชเปนการเรียงแบบ O(N2) แตเปนวิธีที่ควรศึกษาเพราะจะเปน ประโยชนอยางมาก สําหรับบางกรณี เนื่องจากเปนวิธีเรียงลําดับขอมูล ทีเ่ ร็วทีส่ ดุ แตก็มีขอจํากัดมากที่สุด เพราะใชไดเฉพาะกับขอมูลที่เปนจํานวนเต็ม (Integer) เทานัน้ และยังสิ้นเปลืองหนวยความจํามาก มากเทา กับคาสูงสุดของขอมูล หลักการเรียงลําดับขอมูลวิธนี ้ี จะเก็บคาตามดัชนีที่มีคาตรงตามขอมูลนั้นเลย ดัง นัน้ วิธนี จ้ี ะเก็บไดเฉพาะคาบวกเทานัน้ สําหรับบางภาษาสามารถใชดัชนีเปนอักขระ ดังนัน้ ก็จะสามารถเรียง ตามอักขระได แตกเ็ ปนกรณียกเวน ไมใชใชไดทุกภาษา Algorithm

(การเรียงลําดับขอมูลจากนอยไปมาก)


!$% กําหนดให

BigVal : ตัวแปรเก็บขอมูลที่มีคามากที่สุด (ตัวแปรอื่น ๆ ยังคงเหมือนเดิม) bucket[I] : ตัวแปรชุดชั่วคราวสําหรับใชในการเรียงลําดับขอมูล

(สําหรับกรณีที่ขอมูลไมมีคาซ้ํากัน) Procedure Bucket_Sort (Var : A[Max]) Begin BigVal := -9999; For(I:=1 to Max) Do If(A[I] > BigVal) Then BigVal := A[I]; For(I:=1 to BigVal) Do bucket[I] := 0; For(I:=1 to Max) Do bucket[A[I]] := A[I]; J := 0; For(I:=1 to BigVal) Do Begin If(bucket[I] > 0) Then Begin J := J+1; A[J] := bucket[I]; End; End; End.

(สําหรับกรณีทข่ี อ มูลมีคา ซ้าํ กัน) Procedure Bucket_Sort (Val : A[Max]) Begin BigVal := -9999; For(I:=1 to Max) Do If(A[I] > BigVal) Then BigVal := A[I]; For(I:=1 to BigVal) Do bucket[I] := 0; For(I:=1 to Max) Do bucket[A[I]] := bucket[A[I]] + 1; J := 0; For(I:=1 to BigVal) Do Begin If(bucket[I] > 0) Then For(n=1 to bucket[I]) Do Begin J := J+1; A[J] := I; End; End; End.

Merge sort เปนวิธีการเรียงแบบรวมขอมูลจาก 2 แถวลําดับ ที่มีขอมูลเรียงกันอยูแลว หลักการเรียงลําดับขอ มูลวิธีนี้ เริ่มจากการนําคาแรกของแถวลําดับแรก มาเปรียบเทียบกันคาแรกของแถวลําดับที่ 2 ถาคาของ แถว ลําดับใดนอยกวาจะจัดเก็บคานั้นลงในแถวลําดับใหม (สําหรับการเรียงจากนอยไปมาก) แลวอานคาถัด


!$& ไปมาเปรียบเทียบอีก ดําเนินงานเชนนีไ้ ปเรือ่ ย ๆ จนกวาคาในแถวลําดับใดลําดับหนึ่งหมด หรือหมดทั้งคู จากนั้นถาคาในแถวลําดับใดไมหมด จะจัดเก็บคาที่เหลือลงในแถวลําดับใหมจนกวาจะหมด การเรียงลําดับขอ มูลนีจ้ งึ ถือวาสําเร็จสมบูรณ แตถาขอมูลหมดพรอมกันทั้งคู ก็ถอื วาการเรียงลําดับสําเร็จเรียบรอยแลว Ex จงเรียงลําดับขอมูลจากแถวลําดับ 2 แถวลําดับ ดวยวิธี Merge Sort โดยเรียงลําดับขอมูลจากนอย ไปหามาก กําหมดใหแถวลําดับที่ 1 มีคา 11, 23, 42 ; แถวลําดับที่ 2 มีคา 9, 25 ขัน้ ตอนการเรียงลําดับขอมูลมีดงั นี้ 1. นําคา 11 จากแถวลําดับที่ 1 มาเปรียบเทียบกับคา 9 ในแถวลําดับที่ 2 จะเห็นวา 9 นอยกวา 11 ดังนั้นจึงจัดเก็บคา 9 ลงใน แถว ลําดับใหมแถวลําดับใหมมีคาดังนี้ 9 2. อานคา 25 จากแถวลําดับที่ 2 เนือ่ งจากเลข 9 ที่จัดเก็บไปอยูแถวลําดับที่ 2 3. คา 11 จากแถวลําดับที่ 1 นอยกวา คา 25 ในแถวลําดับที่ 2 ดังนัน้ จัดเก็บคา 11 ลงในแถว ลําดับใหม แถวลําดับใหมมีคาดังนี้ 9, 11 4. อานคา 23 จากแถวลําดับที่ 1 เนือ่ งจากเลข 11 ที่จัดเก็บไปอยูแถวลําดับที่ 1 5. คา 23 จากแถวลําดับที่ 1 นอยกวา คา 25 ในแถวลําดับที่ 2 ดังนัน้ จัดเก็บคา 23 ลงในแถว ลําดับใหม แถวลําดับใหมมีคาดังนี้ 9, 11, 23 6. อานคา 42 จากแถวลําดับที่ 1 เนือ่ งจากเลข 23 ที่จัดเก็บไปอยูแถวลําดับที่ 1 7. คา 42 จากแถวลําดับที่ 1 มากกวา คา 25 ในแถวลําดับที่ 2 ดังนัน้ จัดเก็บคา 25 ลงในแถว ลําดับใหม แถวลําดับใหมมีคาดังนี้ 9, 11, 23, 25 8. เนือ่ งจากคา ในแถวลําดับที่ 2 หมด ดังนั้นจึงจัดเก็บคาที่เหลือในแถวลําดับที่ 1 ลงในแถว ลําดับใหมจนหมด ดังนั้นแถวลําดับใหมจึงมีคาดังนี้ 9, 11, 23, 25, 42 ในการเรียงขอมูลแบบ Merge Sort ไมมีขอจํากัดที่จะเรียงเฉพาะขอมูล 2 แถวลําดับ แตจะ สามารถเรียงลําดับขอมูลจากหลาย ๆ แถวลําดับได ตามความตองการ ลักษณะเดน สําหรับการเรียงลําดับ ขอมูลแบบนี้คือ กรณีที่มีขอมูลจํานวนมาก ๆ มากจนหนวยความจําหลัก (Main Memory) ไมสามารถรับ ได และขอมูลเหลานี้ ไดจัดเก็บในแฟมขอมูลเรียบรอยแลว ซึ่งในความเปนจริง มักเปนเชนนี้ การเรียงลําดับ ขอมูล จะตองแบงเปนแฟมเล็ก ๆ หลายแฟม แลวดําเนินการเรียงลําดับขอมูลทีละแฟม ซึ่งแลวแตจะเลือก เรียงดวยวิธีใดก็ได จากนั้นจึงทําการรวมแฟมขอมูลเล็กๆ เหลานีอ้ กี ที Ex จากขอมูล 42, 23, 74, 11, 65, 58, 94, 36, 99, 87 จงเรียงลําดับขอมูลจากนอยไปหามาก จากโจทยแบงเปนแฟมขอมูลยอย ๆ ไดดงั นี้


!$' 42

23

74

11

65

58

94

36

99

87

23

42

11

74

58

65

36

94

87

99

11

23

42

74

36

58

65 94

87

99

11

23

36

42

58

65

74 94

87

99

11

23

36

42

58

65

74 87 94

99

Algorithm

(การแยกแฟมขอมูลออกเปนแฟมเล็ก ๆ)

กําหนดให

Temp : ตัวแปรเก็บชื่อแฟมขอมูลยอย Data.dat : ชื่อแฟมขอมูลหลัก แฟมขอมูลยอยเก็บขอมูลไมเกิน 10000 คา

(* การประกาศตัวแปรเพื่อเตรียมเก็บรายชื่อแฟมขอมูลยอย ๆ *) Var

Temp : Array[1..15] of String[15]; Id : String[2];

(* การเก็บรายชื่อแฟมขอมูลยอย ๆ *) For (I:=1 to 15)

Do

Begin Str(I, Id); (* Integer to String *) Temp[I] := “tempFile"; Concat(Temp[I],Id); End;

(* การแยกแฟมขอมูล *)


!$( I := 1; OpenFile(“Data.dat”); OpenFile(Temp[I]); Count := 0; While (Read(Vardata from ”Data.dat”) ≠ EOF) Begin If (Count > 10000) Then Begin CloseFile(Temp[I]); I := I+1; Count := 0; OpenFile(Temp[I]); End; Write(Vardata to Temp[I]); Count := Count + 1; End; CloseFile(Temp[I]); End.

Do

การเรียงลําดับขอมูลในไฟลยอ ย สําหรับการเรียงลําดับขอมูลในไฟลขอ มูลยอย จะเปนการเรียงลําดับขอมูลแบบภายใน หมายความ วาจะอานขอมูลทั้งหมด เขาไปจัดเก็บในหนวยความจําหลัก จากนั้นจึงทําการเรียงลําดับขอมูล ซึง่ ขัน้ ตอนนีไ้ ด กลาวมาแลวขางตน สามารถเลือกวิธีใดก็ไดตามความตองการและความเหมาะสม จากเหตุผลดังกลาวจึงเห็น วา จํานวนขอมูลในไฟลขอมูลยอยไมควรนอยเกินไป ซึ่งจะทําใหมีไฟลขอมูลยอยมาก และจะทําใหเสียเวลา ในการอานขอมูล และจัดเก็บขอมูลลงแฟม โดยใชเหตุ Algorithm (การรวมแฟมขอมูล A และ B เก็บใสในแฟมขอมูล C)


!$) Procedure Merge_Sort (FILE : FileA , FileB , FileC) Begin OpenFile (FileA , FileB , FileC); Read (a from FileA, b from FileB); While ((FileA not EOF) and (FileB not EOF)) Do Begin If (a < b) Then Begin Write (a to FileC) ; Read (a from FileA) ; End; Else If (a > b) Then Begin Write (b to FileC); Read (b from FileB); End; Else Begin Write (a , b to FileC); Read (a from FileA , b from fileB); End; End; While (FileA not EOF) Do Begin Write (a to FileC) ; Read (a from FileA) ; End; While (FileB not EOF ) Do Begin Write (b to FileC); Read (b from FileB ); End; CloseFile (FileA , FileB , FileC); End.

External Sort ดังไดกลาวมาแลว สําหรับกรณี ที่มีขอมูลจํานวนมาก ๆ มากจนไมสามารถเรียงลําดับขอมูลใน คราวเดียวกันได จําเปนตองแบงขอมูลเปนแฟมเล็ก ๆ เพือ่ ทําการเรียงลําดับกอนนํามารวมกันใหมอกี ครัง้ สําหรับ วิธีที่จะกลาวถึงนี้ ก็เปนอีกวิธหี นึง่ ที่ใชในการแกปญหา การเรียงลําดับขอมูลจํานวนมาก ๆ ซึง่ เปนวิธีที่ งาย มีประสิทธิภาพ และถือวาเปนวิธีเรียงลําดับขอมูลภายนอกโดยแทจริง ดังนั้นจึงไมจําเปนตอง ใชหนวยความจํามาก แตวิธีนี้จะขึ้นอยูกับความสามารถในการเขาถึงขอมูล (Access Time) ของ Hard disk โดยตรง


!%* หลักการเรียงลําดับขอมูลมีดงั นี้ 1. อานขอมูล จากแฟมขอมูลหลักมา 1 คา แลวจัดเก็บลงในแฟมขอมูลชั่วคราว แฟมที่ 2 2. อานขอมูล จากแฟมขอมูลหลักมาอีก 1 คา ถาคาทีอ่ า นมาได มีคามากกวา คาทีอ่ า นมากอน หนานี้ ใหจัดเก็บลงในแฟมขอมูลชั่วคราวแฟมที่ 2 อีก แตถาไมเปนเชนนั้นใหจัดเก็บลงใน แฟมขอมูลชั่วคราวแฟมที่ 1 3. ทําซ้ําขอ 2 จนกวาขอมูลจะหมด 4. ตรวจสอบดูวา แฟมขอมูลชั่วคราวแฟมที่ 1 มีขอมูลหรือไม ถาไมมีแสดงวาขอมูลที่จัดเก็บใน แฟมขอมูลชั่วคราวแฟมที่ 2 มีการเรียงลําดับเปนทีเ่ รียบรอย ใหจบการทํางาน แตถาแฟมขอ มูลที่ 1 ยังมีขอมูลอยู ใหรวมแฟมขอมูลทั้ง 2 แฟมเขาดวยกัน ตามวิธีที่ 5 (Merge sort) ดังได กลาวมาแลว จากนั้นใหกลับไปดําเนินการตามขอ 1. ใหม จนกวาแฟมขอมูลแฟมที่ 1 ไมมีขอ มูล Ex จากขอมูล 2, 9, 6, 15, 14, 3, 7 จงเรียงลําดับขอมูลจากนอยไปหามาก

2

9

6

14

3

6

9

2 3 2 Null

6

15 2

14

7

2 3

6 2

14 9

3 6

3

7

15

15

7

7

9 14 15

7

9

14

3

6

7

9

14


!%!

Algorithm (การเรียงลําดับขอมูลจากนอยไปหามาก) Procedure External_Merge_Sort (FILE : FileData) Begin Do Begin No := 0 ; OpenNewFile (File1, File2); OpenFile (FileData); Read (temp from FileData); Write (temp to File2); While (Read (Var from FileData) EOF ) Do Begin If (Var ≥ temp)

not

Then Write (Var to File2); Else Begin

Write (Var to File1); No := No+1; End; temp := Var; End; If (No ≠

0)

Then

Mergesort (File1 , File2

, FileData); End; While (No >0); CloseFile (File2); MoveFile(File2 to FileData); End.

กิจกรรม 8.2 1. จงเขียนโมดูล (Module) สําหรับการเรียงลําดับขอมูลจากนอยไปหามาก Bubble Sort Shell Sort Insertion Sort 2. จงแสดงตําแหนง และลักษณะของขอมูล ระหวางการเรียงขอมูลจากนอยไปหามาก ดวยวิธีใน ขอ 1. โดยชุดขอมูลมีดังนี้ 2, 1, 8, 4, 3, 9, 6, 0, 7, 5


!%# 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 3. จากขอ 2. การเรียงลําดับขอมูลแบบ Selection Sort และ Bubble Sort (ที่สามารถตรวจสอบ ได) จะมีจํานวนการเรียงลําดับขอมูล แตกตางกันอยางไร 4. ถาขอมูลชุดแรกมีคาดังนี้ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ชุดที่ 2 มีคาดังนี้ 5, 1, 3, 5, 5, 99, 6, 2, 1, 7 การเรียงลําดับขอมูลแบบ Bucket Sort จะมีความแตกตางอยางไร 5. แฟมขอมูลมีขอมูล 200,000 คาจงเขียนโมดูล (Module) เพื่อทําการแยกแฟมขอมูลนี้ ออก เปน 10 แฟมขอมูลยอย 6. จากขอ 5. จงเขียนโมดูล เพื่อทําการเรียงลําดับขอมูลในแฟมขอมูลยอยตาง ๆ โดยการเรียง ลําดับจากมากไปหานอย และใชวิธีเรียงแบบ Bubble Sort 7. จงเขียนโมดูล เพื่อทําการรวมแฟมขอมูลยอยทั้ง 10 แฟมที่เรียงแลวในขอ 6. แบบ Merge sort 8. จากชุดขอมูล : 2, 1, 8, 4, 3, 9, 6, 0, 7, 5 จงแสดงลักษณะของขอมูลระหวางการเรียง ลําดับขอมูลจากนอยไปหามากแบบ External Sort 9. งเขียน โมดูล สําหรับการเรียงลําดับขอมูลจากนอยไปหามากแบบ External Sort ขอมูล ที่จัดเก็บในแถวลําดับ A[Max] จงเขียนโมดูล เพือ่ แสดงขอมูลเหลานี้ ขอเสนอแนะ - ควรนําขอตางที่ใหเขียนโมดูล มาเขียนเปนโปรแกรมจริง ๆ เพือ่ ฝกฝนหาประสบการณจริง ๆ เนือ่ งจากจะมีเหตุตา งๆ ที่เราคาดไมถึง ทําใหโปรแกรมไมสามารถทํางานได - ในขอ 3 ความแตกตางที่จะพิจารณา ใหพิจารณาในแงของการใชหนวยความจํา จํานวนครั้ง ในการเรียงลําดับขอมูล ความแตกตางในการเขียน Algorithm

data structure lesson08  

กิจกรรมการเรียนการสอน กิจกรรมที่นักศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 8.1 และตอนที่ 8.2 แผน...

Read more
Read more
Similar to
Popular now
Just for you