!"!
แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา นายพงษวุฒิ ดวงศรี รายละเอียดของเนือ้ หา ตอนที่ 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