The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by kittisaksoulz, 2022-03-27 12:57:27

ebook โครงสร้างข้อมูลและขั้นตอนวิธี

ilovepdf_merged (1)

บทที่ 9
การเรยี งลำดบั ข้อมลู และการคน้ หาข้อมูล

การเรียงลำดับข้อมูลเป็นการจัดระเบียบให้กับข้อมูลเพ่ือเพิ่มประสิทธิภาพในการค้นหาข้อมูล
เพ่ือการนำข้อมูลมาทำการแก้ไข เพื่อนำข้อมูลมาออกรายงาน อีกทั้งช่วยให้การเขียนโปรแกรมมีความ
สะดวกย่ิงขึ้น การเรียงลำดับข้อมูลของระบบคอมพิวเตอร์มี 2 ลักษณะ คือ การเรียงข้อมูลภายใน
(Internal Sorting) เป็นการเรียงลำดับข้อมูลที่มีจำนวนข้อมูลขนาดไม่ใหญ่กว่าเนื้อท่ีในหน่วยความจำ
โดยจะคำนวณและจัดเรียงข้อมูลภายในหน่วยความจำหลักของเครื่องคอมพิวเตอร์ (Main Memory)
เช่น การเรียงข้อมูลในหน่วยความจำแรม(RAM) เป็นต้น และการเรียงข้อมูลภายนอก (External
sorting) จะใช้กบั ข้อมลู ทม่ี ีขนาดใหญ่เกนิ กว่าที่จะเกบ็ ลงในหนว่ ยความจำภายในได้หมดภายในคร้ังเดียว
และจะใช้สำหรับการเรียงข้อมูลสำหรับหนว่ ยความจำภายนอก เช่น ฮาร์ดดิสก์ เทปแมเ่ หล็ก เปน็ ตน้ ใน
บทน้จี ะขอกล่าวถงึ เฉพาะการเรียงลำดับข้อมลู ภายใน ซ่ึงสามารถทำไดห้ ลายวิธีดงั น้ี

9.1 การเรียงลำดับผสาน
การเรียงลำดับผสาน (Merge Sort) เป็นวิธีการเรียงลำดับข้อมูลที่ต้องการจัดเรียงในปริมาณ

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

ตวั อยา่ งที่ 9.1 แสดงการเรียงลำดบั ผสานของ 2 ตาราง
ตารางที่ 1 1 12 34
ตารางท่ี 2 19 20 25
ผลลัพธ์ 1 12 19 20 25 34

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

148

ดังนัน้ สามารถเขียนเปน็ ขัน้ ตอนวิธีไดด้ ังน้ี
Pseudo Code 9.1 : Merging (A,R,B, S,C) Let A and B be sorted arrays with R
and S elements, respectively. This algorithm merges A and B into array C
with N= R+S elements.
Step 1 [Initialize] Set NA = 1 and PRT = 1.
Step 2 [Compare] Repeat while (NA <= R) and (NB<=S) do

If A[NA] < B[NB] then :
(a) [assign element from A to C] Set C[PTR] = A[NA].
(b) [Update pointer] Set PTR = PTR+1 and NA = NA+1.

else :
(a) [assign element from B to C] Set C[PTR] = B[NB].
(b) [Update pointer] Set PTR = PTR+1 and NB = NB+1.
[End of If Structure]

[End of loop]
Step 3 [assign remaining elements to C]

If NA> R then :
Repeat for K= 0,1,2,…,S – NB do
Set C[PTR +K ] = B[NB+K].
[End of loop]

else :
Repeat for K= 0,1,2,…,R – NA do
Set C[PTR +K ] = A[NA+K].
[End of loop]

[End of If Structure]
Step 4 Exit.

149

9.2 การเรยี งลำดับแบบเลือก

การเรียงลำดับแบบเลือก (Selection Sort) เป็นวิธีการเรียงลำดับข้อมูลท่ีเรียบง่าย ในกรณีท่ี

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

สลับกับระเบียนแรก จากน้ันพิจารณาข้อมูลใหม่โดยไม่สนใจระเบียบแรกท่ีสลับแล้ว เปรียบเทียบจน

หมดข้อมูล ส่วนกณีท่ีเป็นการเรียงลำดับข้อมูลจากมากไปหาน้อย การเรียงลำดับวิธีนี้จะทำการค้นหา

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

เชน่ ยกนั แล้วทำการเปรยี บเทยี บจนหมดข้อมลู

ตวั อยา่ งที่ 9.2 แสดงการเรยี งลำดับขอ้ มลู จากน้อยไปหามากโดยใช้วิธกี ารเรยี งลำดบั แบบเลือก

จากตัวเลขตอ่ ไปนี้ 42,23,74,11,65,58,94,36,99,87

คร้งั ที่ 1 เมื่อพิจาณาข้อมูลท้ังหมดจะพบวา่ 11 เปน็ คา่ ที่น้อยทส่ี ุดของชุดข้อมูลท้ังหมด ดังนัน้

ในรอบนี้จะทำการสลับ 11 กับ 42 จะได้ข้อมลู ที่สลบั แลว้ ดังนี้

ครง้ั ท่ี 1 11 23 74 42 65 58 94 36 99 87

คร้ังท่ี 2 เม่ือพจิ าณาข้อมูลทั้งหมดจะพบวา่ 23 เป็นค่าที่น้อยทส่ี ดุ ของชุดข้อมลู ท่เี หลือ ซงึ่ เปน็

ขอ้ มูลที่อย่ใู นระเบียนแรกแล้ว ดังน้นั ในรอบนจ้ี ะไดข้ ้อมูลดังน้ี

คร้งั ที่ 2 11 23 74 42 65 58 94 36 99 87

ครั้งที่ 3 เมื่อพิจาณาข้อมูลทั้งหมดจะพบว่า 36 เปน็ คา่ ที่น้อยที่สุดของชุดข้อมูลที่เหลือ ดังนนั้

ในรอบนจ้ี ะทำการสลบั 36 กับ 74 จะได้ข้อมูลท่สี ลบั แล้วดังนี้

คร้ังที่ 3 11 23 36 42 65 58 94 74 99 87

คร้งั ที่ 4 เม่ือพิจาณาข้อมลู ท้ังหมดจะพบว่า 42 เปน็ คา่ ทน่ี ้อยทส่ี ุดของชุดข้อมลู ที่เหลือ ซ่ึงเป็น

ขอ้ มลู ท่ีอยใู่ นระเบยี นแรกแล้ว ดงั น้ันในรอบน้ีจะได้ข้อมูลดังน้ี

ครั้งท่ี 4 11 23 36 42 65 58 94 74 99 87

ครัง้ ที่ 5 เมื่อพจิ าณาข้อมูลทั้งหมดจะพบวา่ 58 เปน็ คา่ ทน่ี ้อยทสี่ ุดของชุดข้อมูลท่ีเหลือ ดังนน้ั

ในรอบนจี้ ะทำการสลับ 58 กับ 65 จะได้ข้อมลู ทสี่ ลับแลว้ ดงั นี้

ครงั้ ที่ 5 11 23 36 42 58 65 94 74 99 87

ครง้ั ที่ 6 เมื่อพจิ าณาข้อมลู ทั้งหมดจะพบวา่ 65 เป็นคา่ ทีน่ ้อยทส่ี ุดของชุดข้อมลู ทเ่ี หลือ ซง่ึ เป็น

ขอ้ มลู ท่ีอยใู่ นระเบียนแรกแล้ว ดงั น้ันในรอบนี้จะได้ข้อมลู ดังนี้

คร้งั ที่ 6 1 23 36 42 58 65 94 74 99 87

ครง้ั ท่ี 7 เมื่อพจิ าณาข้อมลู ทั้งหมดจะพบวา่ 74 เป็นคา่ ทน่ี ้อยที่สดุ ของชดุ ข้อมลู ทเ่ี หลือ ดงั นนั้

ในรอบน้จี ะทำการสลบั 74 กับ 94 จะได้ข้อมลู ท่ีสลับแล้วดังนี้

ครัง้ ที่ 7 11 23 36 42 58 65 74 94 99 87

150

ครง้ั ที่ 8 เม่ือพิจาณาข้อมูลท้ังหมดจะพบวา่ 87 เปน็ ค่าทีน่ ้อยที่สดุ ของชุดข้อมลู ที่เหลือ ดงั นนั้

ในรอบน้ีจะทำการสลบั 87 กับ 94 จะได้ขอ้ มูลทส่ี ลบั แล้วดังนี้

คร้ังที่ 8 11 23 36 42 58 65 74 87 99 94

ครัง้ ที่ 9 เมื่อพิจาณาข้อมลู ท้ังหมดจะพบวา่ 94 เปน็ ค่าทนี่ ้อยที่สุดของชดุ ข้อมูลที่เหลือ ดงั นนั้

ในรอบน้ีจะทำการสลบั 94 กับ 99 จะได้ขอ้ มลู ทส่ี ลบั แลว้ ดังน้ี

ครั้งที่ 9 11 23 36 42 58 65 74 87 94 99

ครงั้ ท่ี 10 ข้อมลู ทเี่ หลือตวั สุดทา้ ย ไมต่ ้องเปรียบเทยี บกบั ข้อมลู ใดไดด้ ัดังนี้

ครง้ั ที่ 10 11 23 36 42 58 65 74 87 94 99

ดังนั้นสามารถเขยี นเปน็ ขัน้ ตอนวิธไี ดด้ งั น้ี
Pseudo Code : 9.2-1 Selection(A,N)
Step 1 Repeat Step 2 and 2 for K= 1,2,…,N-1 do
Step 2 Call MIN(A,K,N,LOC)
Step 3 [Interchange A[K] and P[LOC]

Set TEMP = A[K], A[K] = A[LOC] and A[LOC] = TEMP.
[End of Step 1 Loop]
Step 4 Exit.

Procedure : 9.2-2 MIN(A,K,N,LOC]
A[K], A[K+1], …A[N]
Step 1 [Initialize Pointer] Set MIN = A[K] and A[LOC] = K.
Step 2 Repeat for J=K+1,K+2,…N do

If MIN > A[J] , then :
Set MIN = A[J] and LOC = J.

[End of loop]
Step 3 Return.

151

9.3 การเรียงลำดับแบบแทรก
การเรียงลำดบั แบบแทรก (Insertion Sort) เปน็ วธิ กี ารเรียงลำดับขอ้ มลู ที่ไม่ซับซ้อน การเรียง

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

ตวั อยา่ งที่ 9.3 แสดงการเรียงลำดับข้อมูลจากน้อยไปหามากโดยใชว้ ธิ ีการเรียงลำดับแบบแทรก
จากตัวเลขต่อไปน้ี 42,23,74,11,65,58,94,36,99,87

รอบท่1ี รอบท่ี2 รอบท3่ี รอบท4่ี รอบท5่ี รอบท6ี่ รอบท่7ี รอบท่ี8 รอบท9ี่ รอบที่10

42 23 74 11 65 58 94 36 99 87
42 23 23 11 11 11 11 11 11 11
23
42 42 23 23 23 23 23 23 36
74 42 42 42 42 36 36 42
74 65 58 58 42 42 58
74 65 65 58 58 65
74 74 65 65 74
94 74 74 87
94 94 94
99 99

ดงั นัน้ สามารถเขยี นเป็นข้นั ตอนวิธีไดด้ งั นี้
Pseudo Code 9.3 : InsertionSort(A,N)
Step 1 Set A[0] = α.
Step 2 Repeat Step 3 to 5 for K = 2,3,4 …to N do
Step 3 Set TEMP = A[K] and PTR = K-1.
Step 4 Repeat while ( TEMP < A[PTR] ) do

(a) Set A[PTR + 1] =A[PTR] [ Moves element forward].
(b) Set PTR = PTR -1.
[End of loop]

152

Step 5 Set A[PTR+1] = TEMP [ Insert element in proper place].
[End of Step 2 loop]

Step 6 Return.

9.4 การเรียงลำดับแบบฟอง
การเรียงลำดับแบบฟอง (Bubble Sort) เป็นวิธีการเรียงลำดับที่จะทำการเปรียบเทียบค่า 2

คา่ ท่ีอยู่ติดกนั แลว้ สลบั เพือ่ ให้เรียงลำดบั โดยเร่ิมเปรียบจากตวั ท่ี 1 กับ 2 และ 2 กับ 3 ไปเร่ือยๆ จนกว่า
ครบทุกคา่ แลว้ ทำซำ้ อีกจนกวา่ จะไม่มกี ารสลบั ท่ี ดงั ตวั อย่างท่ี 9.4

ตวั อย่างที่ 9.4 แสดงการเรยี งลำดับแบบฟอง จากข้อมลู ต่อไปนี้ 5,4,6,8,2 จงเรยี งข้อมูลให้
เรยี งลำดับจากน้อยไปหามาก

ขอ้ มลู รอบท่ี 1 รอบท่ี 2 รอบท่ี 3 รอบท่ี 4
54 4 4 2
45 5 2 4
66 2 5 5
82 6 6 6
28 8 8 8

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

ดังน้ันสามารถเขยี นเปน็ ข้นั ตอนวธิ ไี ด้ดงั นี้
Pseudo Code 9.4 : BubbleSort (list, last)
Step 1 [Initialize] Set Current = 0 ,
Step 2 Set Sorted = false.
Step 3 Repeat while (Current <= last and Sorted false) do

(a) Set walker = last.
(b) Set Sorted = true.

Repeat While (Walker > Current) do
If (walker data <walker-1data , then :
Set Sorted = false.
Exchange (list,walker,walker-1).
[End of If Structure]

153

Decrement walke.
[End of loop]
Step 4 Set Current = Current +1.
[End of loop]
Step 5 Exit.

9.5 การเรียงลำดับแบบฐาน
การเรยี งลำดับแบบฐาน (Radix Sort) เป็นวิธีการเรยี งข้อมลู แบบเตรยี มท่ไี ว้ใส่ตัวเลขที่พจิ ารณา

เท่ากับจำนวนฐานของตัวเลข ซ่ึงอาจมองเป็นกระเป๋า (Pocket) ดังนั้นถ้าเป็นเลขฐานสิบก็จะมีกระเป๋า
10 ใบ สำหรับใสเ่ ลขในหลักท่ีพจิ ารณาที่เปน็ คา่ เดียวกับหมายเลขของกระเป๋า ดังภาพประกอบท่ี 9.1

คา่ หมายเลขแตล่ ะหลกั 0 1 2 3 4 5 6 7 8 9

ภาพประกอบที่ 9.1 กระเป๋าใส่ต2วั 2เลขเพ่อื เรียกลำดบั สำหรบั เลขฐานสบิ

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

ตัวอย่างที่ 9.5 แสดงการเรียงลำดับแบบฐาน จากข้อมูลต่อไปน้ี 42 23 74 11 65 57 94
36 99 87 จงเรียงลำดับขอ้ มลู จากน้อยไปหามาก

จากโจทย์ข้อมูลตัวเลขที่ต้องการเรียงแบบฐาน มีทั้งหมด 2 หลัก คือ หลักหน่วยและหลักสิบ
ดงั นน้ั จะนำขอ้ มูลมาพจิ ารณาแต่ละหลกั โดยเริ่มจา หลกั หน่วยและ หลักสิบตามลำดบั

154

รอบที่ 1 พิจารณาหลกั หน่วย
กระเป๋า ขอ้ มลู ท่ีพจิ ารณาหลกั หนว่ ย

0
1 11
2 42
3 23
4 74 94
5 65
6 36
7 57 87
8
9 99
ผลท่ไี ด้ในการทำงานรอบแรกหลักหน่วย 11 42 23 74 94 65 36 57 87 99

รอบท่ี 2 พจิ ารณาหลักสบิ
(โดยนำผลทีไ่ ดจ้ ากการทำงานในรอบแรกหลักหน่วยมาพจิ ารณาในหลกั สบิ ต่อ)
กระเป๋า ขอ้ มลู ท่ีพิจารณาหลกั สิบ

0
1 11
2 23
3 36
4 42
5 57
6 65
7 74
8 87
9 94 99
ผลทไ่ี ดใ้ นการทำงานรอบสองหลกั สบิ 11 23 36 42 57 65 74 87 94 99
ดังนั้นผลลัพธ์แสดงการเรียงลำดับแบบฐานจากข้อมูล 42 23 74 11 65 57 94 36 99
87 สามารถจัดเรียงท้ังหมด 2 หลัก โดยมีผลลัพธ์สุดท้ายดังน้ี 11 23 36 42 57 65 74 87 94
99

155

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

9.6 การเรยี งลำดับแบบฮีป
การเรียงลำดับแบบฮีป (Heap Sort) เปน็ วิธีการเรียงลำดับในรปู ของต้นไมบ้ ริบูรณ์แบบทวิภาค

(Complete Binary Tree) โดยมี 2 ขั้นตอน คือ การสร้างต้นไม้แบบฮีป (Heap Tree) และการ
ปรับปรงุ ต้นไม้แบบฮีป ใหข้ อ้ มลู เรยี งลำดับ

ขั้นท่ี 1 การสรา้ งตน้ ไม้แบบฮปี
การแตกก่งิ ของโหนดในการสรา้ งต้นไม้แบบฮีป จะอยภู่ ายใต้เงือ่ นไขคือ

1. ทุกระดบั ของตน้ ไม้ จะแตกสาขาออกไปได้ 2 ทาง คอื เร่มิ จากโหนดลูกซ้ายและ
ตามดว้ ยโหนดลูกขวาเสมอ และจะต้องมีโหนดในระดับบนครบ 2 ด้านกอ่ น จึงจะแตกโหนดระดบั ล่างได้

2. นำโหนดใหมว่ าง เริม่ จากโหนดพ่อ โหนดลูกซา้ ย และโหนดลูกขวา ตามลำดับ
3. เปรยี บเทียบค่าของโหนดใหมก่ บั โหนดพ่อ ถ้ามากกว่าโหนดพ่อใหส้ ลบั ทก่ี ัน

ตวั อยา่ งท่ี 9.6 แสดงการสรา้ งฮปี เมื่อนำข้อมูลเข้าคือ 22, 35, 42, 38, 32, 26, 27, 90
1. นำขอ้ มลู เขา้ คอื 22 จะทำการสร้างโหนดแรกหนง่ึ โหนดเป็นโหนดพ่อ (Root Node)

22

2. นำข้อมลู เข้าคอื 35 เป็นโหนดลกู ซา้ ยของโหนดพอ่ เมอ่ื เปรียบเทยี บกบั โหนดพอ่ พบว่า 35
มากกว่าไม่สามารถเป็นลูกได้ ต้องทำการสลับตำแหน่งกับ 22 โดยเลื่อน 22 ลงเป็นโหนดลูกซ้าย แล้ว
กำหนดให้ 35 เปน็ โหนดพอ่

22 35
22
35

156

3. นำข้อมูลเข้าคือ 42 เป็นโหนดลูกขวาของโหนดพอ่ เมอื่ เปรียบเทยี บกบั โหนดพ่อพบว่า 42
มากกว่าไม่สามารถเป็นลูกได้ ต้องทำการสลับตำแหน่งกับ 35 โดยเลื่อน 35 ลงเป็นโหนดลูกขวา แล้ว
กำหนดให้ 42 เปน็ โหนดพอ่

35 42

22 42 22 35

4. นำขอ้ มลู เข้าคือ 38 เป็นโหนดลกู ซา้ ยของ 22 เมื่อเปรียบเทียบกับโหนดพ่อ คอื 22 พบวา่
38 ไม่สามารถเปน็ ลูกได้ ต้องทำการสลับ 38 กับ 22 และทำการเปรียบเทยี บ 38 กบั โหนดพ่อคอื 42
พบวา่ 38 สามารถเป็นลกู ของ 42 ได้

42 42

22 35 38 35

38 22

5. นำขอ้ มูลเข้าคอื 32 เป็นโหนดลูกขวาของ 38 ได้

42 42
38 35 38 35
22 32 22 32

6. นำขอ้ มลู เขา้ คอื 26 เป็นโหนดลกู ซา้ ยของ 35 ได้ 42
38 35
42
38 35 32 26

22 32 26 22

157

7. นำขอ้ มลู เขา้ คือ 27 เป็นโหนดลูกขวาของ 35 ได้

42 42
38 35
38 35

22 32 26 27 22 32 26 27

8. นำข้อมูลเข้าคือ 90 เป็นโหนดลูกซ้ายของ 22 พบว่า 90 ไม่สามารถเป็นลูกได้ ต้องทำการ
สลบั 90 กับ 22 เม่ือ 90 เปน็ โหนดลูกซ้ายของ 38 พบว่า 90 ไมส่ ามารถเป็นลกู ของ 38 ได้ ต้องทำการ
สลับ 90 กับ 38 และเมื่อ 90 เป็นโหนดลูกซา้ ยของ 42 พบว่า 90 ไม่สามารถเป็นลูกของ 42 ได้ ต้องทำ
การสลบั 90 กบั 42 จะไดต้ ้นไมท้ ่ีเปน็ ฮีปท่ีมี 90 เป็นโหนดพ่อ

42 90
38 35 42 35

22 32 26 27 38 32 26 27
90
22

ขนั้ ท่ี 2 การปรับตน้ ไม้ใหม้ ีคุณสมบตั ฮิ ีป
การปรับตน้ ไมใ้ ห้มีคุณสมบัติฮีป มี 3 ข้ันตอนดังน้ี

1. ข้ันตอนการสลับ โดยการสลับค่าในตำแหน่งโหนดราก(Root node) กับโหนด
สุดทา้ ย จากต้นไม้ที่เปน็ ฮปี ท่ไี ด้

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

3. จากนัน้ ทำข้อ 1 และ 2 ซ้ำอกี จนครบทกุ โหนด ดงั ตวั อยา่ งท่ี 9.11

158

ตัวอยา่ งท่ี 9.11 แสดงการปรับตน้ ไม้แบบฮีปให้มีคุณสมบตั ิการเรยี งลำดับแบบฮปี จากต้นไม้ที่
ไดจ้ ากการสรา้ งในข้นั ที่ 1

90
42 35

38 32 26 27

22

รอบที่ 1 ขัน้ ตอนการสลับ สลบั ทรี่ ะหว่างโหนดรากคือ 90 กบั โหนดสดุ ทา้ ยคอื 22 จะ
ได้

22

42 35

38 32 26 27

90

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

42

22 35

38 32 26 27

90

159

เปรียบเทียบโหนด 22 กับโหนดลูกซ้ายและโหนดลูกขวาท่ีมากกว่า 22 และมากที่สุด
จะได้ 38 สลับกับ 22

42

38 35

22 32 26 27

90

ดงั นัน้ สลับที่ระหวา่ งโหนดรากคอื 90 กับโหนดสดุ ท้ายคือ 22 จะได้ผลลพั ธส์ ดุ ทา้ ยคือ

42

38 35

22 32 26 27

90

รอบที่ 2 ขั้นตอนการสลับท่รี ะหว่างโหนดรากคือ 42 กับโหนดสดุ ท้ายคือ 27 จะได้

27

38 35

22 32 26 42

90

160

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

38

27 35

22 32 26 42

90

เปรยี บเทียบ 27 กบั โหนดลูกซ้ายและโหนดลกู ขวาทมี่ ีค่ามากกว่า 27 และมากท่สี ดุ จะ
ได้ 32 สลบั กบั 27 จะได้

38

32 35

22 27 26 42

90

รอบท่ี 3 ขั้นตอนการสลับทร่ี ะหว่างโหนดรากคือ 38 กับโหนดสดุ ท้ายคอื 26 จะได้

26
32 35
22 27 38 42
90

161

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

35

32 26

22 27 38 42

90

รอบที่ 4 ขน้ั ตอนการสลบั ทร่ี ะหว่างโหนดรากคือ 35 กบั โหนดสดุ ทา้ ยคอื 27 จะได้

22 27 42
90 32 26

35 38

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

32

27 26

22 35 38 42

90

162

รอบท่ี 5 ขัน้ ตอนการสลบั ท่ีระหว่างโหนดรากคือ 32 กบั โหนดสดุ ทา้ ยคอื 22 จะได้

22
27 26
32 35 38 42
90

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

27
22 26
32 35 38 42
90

รอบที่ 6 ขน้ั ตอนการสลบั ที่ระหว่างโหนดรากคือ 27 กับโหนดสดุ ท้ายคือ 26 จะได้

26
22 27
32 35 38 42
90

163

ข้ันตอนการปรับ จะเห็นได้ว่า เมื่อ 26 เป็นโหนดราก ทำให้ต้นไม้มีคุณสมบัติเป็นฮีป
ดงั นัน้ จะได้

26
22 27
32 35 38 42
90

รอบที่ 7 ขน้ั ตอนการสลบั ทีร่ ะหวา่ งโหนดรากคือ 26 กบั โหนดสดุ ท้ายคือ 22 จะได้

22
26 27
32 35 38 42
90

ดังนั้นเหลอื 22 เป็นข้อมลู สดุ ท้ายสามารถปรบั ต้นไม้ทีเ่ ปน็ ฮปี ไดเ้ ลย จะได้ตน้ ไม้ทีเ่ ปน็
ฮปี ทีเ่ รียงลำดบั จากน้อยไปหามากดงั น้ี

22
26 27
32 35 38 42
90

164

ดงั นัน้ สามารถเขียนเปน็ ข้นั ตอนวิธไี ดด้ งั นี้ เมอื่ กำหนด อาเรย์ A มีขนาด N อีลีเมนต์
โดยการทำงานของ Call INSHEAP(A,J,A[j+1])

Pseudo Code 9.5 : INSHEAP(TREE, N,ITEM) // สร้าง Heap
A heap H with N elements is stored in the array. TREE , and an ITEM of
information is given. This procedure inserts ITEM as a new element of H.
PTR gives the location of ITEM as it rises in the tree, and PAR denotes the
location of the parent of ITEM.
Step 1 [Add new node to H and initialize PTR] Set N=N+1 and PTR = N.
Step 2 [Find location to insert ITEM] Repeat Step 3 to 6 while ( PTR>1) do
Step 3 [Location of parent node] Set PAR = [PTR/2].
Step 4 If ITEM <= TREE[PAR] , then:

Set TREE[PAR] = ITEM, and Return.
[End of If structure].
Step 5 [Moves node down] Set TREE[PAR] = TREE[PAR].
Step 6 [Update PTR] Set PTR = PAR.
[End of Step 2 loop]
Step 7 [Assign ITEM as the root of H]
Set Tree[1] = ITEM.
Step 8 Return.

Pseudo Code 9.6 : DELHEAP(TREE, N, ITEM) // การลบรากของ Heap
A Heap H with N elements is stored in the array TREE. This procedure
Assigns. The root TREE[1] of H to the variable ITEM and then reheaps the
remaining elements. The variable LAST saves the value of the original last
node of H. The pointer PTR , LEFT and RIGHT give the locations of LAST
and its left and right children as LAST sinks in the tree.
Step 1 [Removes root to H] set ITEM = TREE[1]
Step 2 [Removes last node of H] Set LAST = TREE[N] and N=N-1
Step 3 [initialize pointers] Set PTR=1, LEFT =2 and RIGHT = 3
Step 4 [Loop] Repeat steps 5 to 7 while (RIGHT <=N) do

165

Step 5 If LAST >=TREE[PTR] and LAST >= TREE[RIGHT] then:

Set TREE[PTR] = LAST and Return.

[End of If structure]

Step 6 If TREE[RIGHT] <= TREE[LEFT] then :

Set TREE[PTR] = TREE[LEFT} and PTR = LEFT.

Else :

Set TREE[PTR] = TREE[RIGHT] and PTR = RIGHT.

[End of If structure]

Step 7 Set LEFT = 2 * PTR and RIGHT = LEFT +1.

[End of Step 4 loop]

Step 8 If LEFT = N and LAST < TREE[LEFT] then : Set PTR = LEFT.

Step 9 Set TREE[PTR] = LAST.

Step 10 Return.

Pseudo Code 9.7 : HEAPSORT(A,N)
An array A with N elements is given. This algorithm sorts the elements of A
Step 1 [Build a heap H].

Repeat for J=1 to N-1 do
Call INSHEAP (A, J, A[j+1].

[End of loop]
Step 2 [Sort A by repeatedly deleting the root of H]

Repeat While (N>1) do
(a) Call DELHEAP(A,N,ITEM).
(b) Set A[N+1] = ITEM.

[End of loop]
Step 3 Exit.

166

9.7 การเรียงลำดับแบบควกิ
การเรยี งลำดับแบบควิก (Quick Sort) เป็นการเรยี งลำดับโดยการกำหนด key ทต่ี ้องการจัดเรียง

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

ตัวอย่างที่ 9.7 แสดงการเรียงข้อมูลโดยใช้การเรียงข้อมูลแบบควิก (Quick Sort) จากข้อมูล
ตอ่ ไปน้ี 20 40 10 5 14 15 11 50 9 จงเรียงลำดับขอ้ มลู จากน้อยไปหามาก
รอบ ข้อมูล

20 [40 10 5 14 15 11 50 9]
1 [9 40 10 5 14 15 11 50] 20 Key 20 เปรียบเทียบหลงั ไปหน้าสลับตัวที่ <=
2 9 20 [10 5 14 15 11 50 40] Key 20 เปรยี บเทยี บหน้าไปหลังสลับตัวท่ี >
3 [9 11 10 5 14 15] 20 50 40 Key 20 เปรียบเทยี บหลังไปหน้าสลับตวั ท่ี <=

ข้อมลู
4 [9 11 10 5 14 15] 20 50 40 Key 20 เปรียบเทียบหนา้ ไปหลังสลับตัวท่ี >

พบวา่ ไมส่ ามารถสลบั กบั key ไดแ้ สดงว่า 20 พบ
ตำแหนง่ ทต่ี อ้ งการแล้ว ข้อมลู ถูกแบ่งออกเปน็ 2
ส่วนต้องทำการเปรยี บเทียบ key แบบเดิมจนได้
ข้อมูลท่เี รยี งลำดับครบทกุ ตัว

9 [11 10 5 14 15] 20 [50 40]
5 [5 11 10] 9 14 15 20 [50 40] Key 9 เปรียบเทียบหลังไปหนา้ สลับตัวที่ <=
6 5 9 [10 11 14 15] 20 [50 40] Key 9 เปรยี บเทียบหน้าไปหลงั สลับตวั ท่ี >
7 5 9 [10 11 14 15] 20 [50 40] Key 9 เปรียบเทยี บหลังไปหนา้ สลับตัวที่ <=

พบว่าไม่สามารถสลับกบั key ไดแ้ สดงวา่ 9 พบ
ตำแหนง่ ท่ีตอ้ งการแลว้ ขอ้ มลู ถกู แบ่งออกเป็น 2
ส่วนตอ้ งทำการเปรียบเทียบ key แบบเดมิ จนได้
ขอ้ มลู ที่เรยี งลำดับครบทกุ ตัว

[5 ] 9 10 [11 14 15] 20 [50 40]
8 [5 ] 9 10 [11 14 15] 20 [50 40] Key 10 เปรียบเทยี บหลังไปหนา้ สลับตวั ที่ <=

พบวา่ ไมส่ ามารถสลับกับ key ไดแ้ สดงวา่ 10 พบ
ตำแหนง่ ท่ตี ้องการแลว้

[5 ] 9 10 11 [14 15] 20 [50 40]

167

9 [5 ] 9 10 11 [14 15] 20 [50 40] Key 11 เปรียบเทียบหลงั ไปหน้าสลับตัวที่ <=

พบว่าไม่สามารถสลบั กบั key ไดแ้ สดงว่า 11 พบ
ตำแหน่งทต่ี ้องการแลว้

[5 ] 9 10 11 14 [15] 20 [50 40]
10 [5 ] 9 10 11 14 [15] 20 [50 40] Key 14 เปรียบเทียบหลังไปหนา้ สลับตวั ท่ี <=

พบว่าไมส่ ามารถสลับกับ key ไดแ้ สดงว่า 14 พบ
ตำแหน่งที่ตอ้ งการแล้ว

[5 ] 9 10 11 14 [15] 20 50 [ 40]
11 [5 ] 9 10 11 14 [15] 20 [40 ] 50 Key 50 เปรยี บเทยี บหลังไปหนา้ สลับตัวที่ <=
12 [5 ] 9 10 11 14 [15] 20 [40 ] 50 Key 50 เปรยี บเทียบหนา้ ไปหลงั สลับตัวที่ >

พบว่าไมส่ ามารถสลับกับ key ได้แสดงวา่ 50 พบ
ตำแหน่งท่ีต้องการแล้ว

[5 ] 9 10 11 14 [15] 20 [40 ] 50
ดงั นัน้ ข้อมลู ท่ีเหลือ ไม่สามารถเปรยี บเทียบกับเลขตัวอน่ื ๆ ดังนน้ั แสดงวา่ ตัวเลขเหล่านนั้ มตี ำแหนง่ ตาม
ระบุ สามารถเรยี งจำนวนตัวเลขจากมากน้อยไปมากได้ดงั น้ี 5 9 10 11 14 15 20 40 50
โดย key ไดแ้ ก่ 20, 9, 10 11 14 50

9.8 การค้นหาข้อมูล
การค้นหาข้อมูล (Searching) เป็นวิธีที่ใช้ในการค้นหาระเบียนของข้อมูลที่ต้องการว่ามีอยู่ใน

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

1. การคน้ หาขอ้ มูลแบบเรียงลำดับ (Sequential Searching) เป็นการคน้ หา
โดยเร่ิมจากการเปรียบเทียบข้อมูลท่ีต้องการกับข้อมูลในแฟ้มเริ่มตั้งแต่ระเบียนแรก ระเบียนท่ี 2 ไป
เรื่อยๆ จนกว่าจะหมดแฟ้ม การค้นหาวิธีนี่จะเสียเวลามากในกรณีที่ข้อมูลที่ต้องการค้นหาปรากฏอยู่ที่
ทา้ ยแฟ้มข้อมลู แต่ถ้าข้อมลู ทตี่ ้องการค้นหาอยู่ต้นแฟ้มกจ็ ะสามารถคน้ หาไดเ้ รว็

การค้นหาข้อมูลน้ัน จะทำโดยนำข้อมูลท่ีต้องการเปรียบเทียบ กับข้อมูลในตารางท่ีมี
อยทู่ ลี ะคา่ ถ้าไมเ่ ทา่ กนั กจ็ ะเปรยี บเทียบกับตัวถัดไปเรื่อยๆ จนพบซ่ึงจากตวั อยา่ งน้จี ะทำการเปรยี บ
เทียบ 6 ครัง้ จงึ พบขอ้ มูลท่ีตอ้ งการ

168

ดงั นัน้ สามารถเขยี นเปน็ ขนั้ ตอนวธิ ไี ดด้ งั น้ี
Pseudo Code 9.9 : SequentialSearching
Step 1 Set found = false.
Step 2 Set Index to 1 .
Step 3 Input search item.
Step 4 [loop While] While(not found and not at the end of the array) do

If (list at index = search item)
Found = true .
Location = index .

End If [ End of If structure ]
[End of while loop]
Step 5 If found = false output that item was not found .
Step 6 If found = true output location item was found at.
Step 7 End. [End of program]

2. การคน้ หาขอ้ มูลแบบทวิภาค (Binary Search) คน้ หาข้อมลู วธิ ีนีจ้ ะใชค้ ้นหาขอ้ มลู
ในแฟ้มที่มีการเรียงลำดับจากน้อยไปมากแล้ว โดยจะทำให้ค่ากลางแล้วทำการเปรียบเทียบค่ากลางกับ
ข้อมูลที่ต้องการหา ถ้ามีค่าน้อยกว่าก็ให้เปรียบเทียบใหม่กับข้อมูลครึ่งแรก ถ้ามีค่ามากกว่าก็ให้
เปรยี บเทียบใหม่กับขอ้ มูลคร่ึงหลัง และทำการเปรียบเทียบโดยแบง่ ครง่ึ แฟ้มไปเร่ือยๆ ก็จะได้ขอ้ มูลตาม
ต้องการ หรอื หาขอ้ มูลไม่พบ

ตวั อยา่ งที่ 9.8 แสดงการค้นหา 56 จากเลขต่อไปน้ี 11 22 23 44 45 56 67
ข้ันท่ี 1 แบง่ ครึง่ (1+7 div 2 = 4) จะได้ข้อมูลตำแหน่งท่ี 4 คอื 44 เปรยี บเทียบกับ
56
ข้ันท่ี 2 แบ่งข้อมูลครึ่งหลัง (5+7 div 2 = 6) จะได้ข้อมูลตำแหน่งท่ี 6 คือ 56
เปรียบเทยี บ กับ 56
จากตัวอย่างจะเห็นว่าการค้นหา 56 จากตัวเลขทใ่ี ห้มาน้ันจะทำการค้นหาเพียง 2 คร้ัง
ก็จะพบข้อมูลที่ตอ้ งการ
ดงั นนั้ สามารถเขียนเปน็ ข้ันตอนวธิ ไี ดด้ งั น้ี
Pseudo Code 9.10 : BinarySearch(list[ ], searchTarget)
Input: ordered list and element to be searched for (the search target).
Output: location of search target or 0 if target is not found.
Step 1 Set last = length(list[]).

169

Step 2 first = 1.
[ while there are still elements to be searched through]

Step 3 while (first = last)
{
do middle = (first + last) / 2
if (list[middle] = searchTarget) then return middle.
else if (list[middle] < searchTarget) then
first = middle + 1
Else first = middle - 1
[End of If Structuref]
[End of while loop]

Step 4 return 0.

3. การค้นหาดว้ ยวธิ ีแฮชชงิ่ (Hashing Search) หรือ แฮชชิง่ เปน็ กระบวนการแปลง
ข้อมูลให้เป็นตำแหน่งที่เก็บข้อมูล (Address) เพื่อประโยชน์ในการนำข้อมูลไปเก็บและการค้นหาข้อมูล
ท่ีต้องการ ซ่ึงกระบวนการแปลงข้อมูลนี้จะทำโดยฟังก์ชันท่ีเรียกว่า ฟังก์ชันแฮช (Hashing function)
สัญลกั ษณ์ที่ใช้คือ h(k) เม่ือ H เป็นฟังก์ชนั แฮชและ K เปน็ ขอ้ มลู ทนี่ ำมาทำการแฮช การแฮชช่ิงสามารถ
ทำไดห้ ลายวิธีคือ

3.1 วิธีการหาร (Truncation) เป็นวิธีที่นิยมใช้กันมาก โดยจะทำการหารเอา
เศษ มาใช้เป็นตำแหน่งท่ีเก็บข้อมูล ซึ่งสามารถทำได้ทั้งข้อมูลที่เป็นตัวเลขและข้อมูลท่ีเป็นตัวอักษร
เนือ่ งจากเราสามารถนำรหัสแอสกหี รอื เลขฐานสิบหกของข้อมลู ตัวอักษรมาทำการแฮชได้ นอกจากน้ีเรายัง
อาจปรบั ตำแหนง่ ท่อี ยู่ของข้อมูล ใหอ้ ยใู่ นชว่ งท่ตี ้องการ โดยการบวกค่าคงที่ เชน่

H(k) = k mod m ตำแหนง่ ที่อย่ทู ่ไี ด้จะอยู่ระหว่าง 0 ถึง m-1
H(k) = k mod m + 1 ตำแหน่งที่อยู่ที่ไดจ้ ะอยู่ระหว่าง 1 ถงึ m
H(40) = 40 mod 10 = 0
H(15) = 15 mod 10 = 5
H(30) = 30 mod 10 = 0
H(B) = B mod A = 1
3.2 วิธียกกำลัง (Mid square) เป็นวิธีที่นำข้อมูลท่ีต้องการมายกกำลังสอง
จากนั้นเลือกหลักท่ีอยู่ตรงกลางของผลลัพธ์มาเป็นตำแหน่งที่เก็บข้อมูล การเลือกมาจำนวนก่ีหลักนั้น
ขึ้นอยู่กับขนาดของตารางทใ่ี ช้เก็บข้อมูล เชน่ เลือก 1 หลักเม่อื มีตารางจำนวน 10 ช่อง

170

ข้อมูล กำลงั สอง ตำแหน่งที่ได้
24 576 7
21 441 4
14 196 9
17 289 8
35 1225 2

3.3 วิธีพับ (Folding) เป็นวิธีที่ใช้กับข้อมูลขนาดใหญ่หรือมีจำนวนหลัก

มากกว่าขนาดของตารางมาก ๆ ซ่ึงจะทำการหาตำแหน่งท่ีเก็บข้อมูลโดยแบ่งข้อมูลออกเป็นส่วนเท่าๆ

กัน และนำแตล่ ะส่วนมารวมกันเข้า จากนนั้ จงึ เลือกหลกั ทต่ี ้องการมาเป็นตำแหนง่ ทเี่ ก็บข้อมลู เชน่

ข้อมลู ที่ตอ้ งการหา แบง่ ส่วนเท่า ๆ กนั นำแต่ละส่วนมารวมกัน ตำแหน่งทไี่ ด้

123456789 123 456 789 123+456+789 = 1368 368

856412351 856 412 351 856+412+351 = 1619 619

745145236 745 145 236 745+145+236 = 1126 126

หรอื อาจจะกลับหลกั ของบางสว่ นแล้วนำมาบวกกนั จากน้ันตัดตวั ทดทง้ิ ดงั น้ี

ขอ้ มลู ท่ีต้องการหา แบ่งส่วนเทา่ ๆ กัน นำแตล่ ะส่วนมารวมกัน ตำแหนง่ ทไ่ี ด้

123456789 321 456 789 321+456+789 = 1764 764

856412351 658 412 351 658+412+351 = 1223 223

745145236 547 145 236 547+145+236 = 1324 324

การแก้ปัญหาการชนกนั ของตำแหน่งขอ้ มูล
ในการท่ีเรานำข้อมูลมาผ่านกระบวนการต่างๆ เพื่อให้ได้มาซึ่งตัวเลขท่ีจะนำไปใช้เป็น
ตำแหน่งที่เก็บขอ้ มลู นนั้ บางครัง้ ข้อมลู ทีต่ า่ งกัน อาจให้ผลลัพธข์ องตำแหนง่ ท่อี ย่เู ดียวกนั ได้ซงึ่ ปญั หาน้ี
เรียกวา่ การชนกนั ของตำแหนง่ ขอ้ มลู หรือคอลลชิ ช่นั (Collision) มีวิธแี กป้ ญั หา คือ
1. การทำแฮชชิง่ ใหม่ (Rehashing หรอื Open Addressing) สามารถทำได้หลาย
แบบ คือ การทำแฮชช่ิงใหม่แบบเชิงเสน้ (Linear Probing) โดยจะทำการบวกค่าคงท่ีเข้ากับผลลัพธ์ที่ได้
ไปเรื่อย ๆ จนกว่าจะได้ตำแหน่งว่างเพ่ือเก็บข้อมูล เช่น H(k) = H(k)+C ส่วนการค้นหาข้อมูลเมื่อมีการ
ทำแฮชช่ิงใหม่แบบเชิงเส้น จะเร่ิมจากการคำนวณ H(k) เมื่อได้ค่าตำแหน่งท่ีอยู่แล้ว จึงเปรียบเทียบ ณ
ตำแหน่งน้ันกับข้อมูลที่ต้องการหา ถ้าไม่ตรงกันจะใช้สตู รตอ่ ไป คอื H(k) = H(k)+C ซ้ำไปเรอ่ื ย ๆ จนพบ
ขอ้ มลู ทตี่ ้องการหรือเมอื่ ครบจำนวนครัง้ ทส่ี รา้ งไว้แล้ว กส็ ามารถสรปุ ไดว้ า่ ไม่มขี ้อมลู ท่ีตอ้ งการหา

171

ดังน้ันการรีแฮชชิ่ง คือ การแก้ไขการชนกันของตำแหน่งที่อยู่โดยการทำแฮชชิ่งใหม่
ซึ่งจะใช้สูตรเดิม หรือใช้สูตรใหม่ก็ได้ เช่น Rehash(h(k)) = h(k)+C mod m (เมื่อสูตรเดิมคือ h(k) = k
mod m) เป็นต้น ซึ่งการใช้วิธีน้ีแก้ปัญหาการชนกันของตำแหน่งที่อยู่ข้อมูลอาจไม่สัมฤทธ์ิผลก็ได้ถ้าทำ
การรแี ฮชชิ่งแลว้ ไม่พบทว่ี ่างเลย

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

ตัวอย่างที่ 9.9 แสดงการแก้ปัญหาการชนกันของตำแหน่งท่ีอยู่ข้อมูล ต่อไปน้ี 45 65
78 14 11 23 56 86 99 97 88 5 และกำหนดใหต้ วั ช้มี ีคา่ -1 เมือ่ ไมไ่ ด้ชไี้ ปท่ใี ด

ตำแหน่ง ขอ้ มลู H(k) = k mod 10 ขอ้ มูล ตวั ช้ี
0 65
1 11 ตวั ช้ี ตำแหน่ง 86 -1
2 -1 0 88 -1
3 23 -1 1 5 -1
4 14 -1 2 -1
5 45 -1 3 -1
6 56 -1 4 -1
7 97 05 -1
8 78 16 -1
9 99 -1 7 -1
28
-1 9

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

172

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

9.9 สรุป
การเรียงลำดบั ข้อมูลมีมากมายหลายวิธี เท่าท่ีเสนอมาในหนังสือเล่มน้ีเป็นเพียงบางวิธีเท่าน้ันที่

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

173

คำถามท้ายบทที่ 9

1. จงแสดงการเรยี งลำดับขอ้ มูลทก่ี ำหนดให้ 45, 98, 5, 6, 7, 88, 91, 14, 15 ดว้ ยวธิ ตี ่อไปน้ี
1.1 การเรียงลำดับแบบเลือก เรียงจากมากไปน้อย
1.2 การเรียงลำดับแบบฟอง เรียงจากนอ้ ยไปมาก
1.3 การเรยี งลำดบั แบบควกิ เรยี งจากน้อยไปมาก
1.4 การเรียงลำดับแบบฐาน เรยี งจากมากไปน้อย
1.5 การเรียงลำดับแบบฮีป เรียงจากนอ้ ยไปมาก

2. จากตน้ ไม้ทเ่ี ปน็ ฮีปต่อไปน้ี จงแสดงวธิ กี ารเรยี งลำดับข้อมูลจากมากไปน้อย

68 45
13

10 14 30 22

0

3. จงเปรียบเทียบขอ้ ดี ข้อเสียของการเรียงลำดับแบบเลอื กและการเรียงลำดบั แบบฐาน
4. การเรยี งลำดบั แบบฟองมลี ักษณะการทำงานคล้ายกับการเรียงขอ้ มลู วิธีใด
5. การเรียงลำดับวิธีใดดที ี่สุดถ้าตอ้ งการเรียงลำดบั ขอ้ มลู ต่อไปน้จี ากนอ้ ยไปหามาก

14 18 7 18 25 16 47
6. การตดั สนิ ใจเลอื กเทคนิคการคน้ หาข้อมลู มาใชง้ านควรพิจารณาจากสิ่งใดบา้ ง
7. การค้นหาดว้ ยวธิ ีแฮชชิง่ (Hashing Search) มหี ลักการในการค้นหาอยา่ งไร
8. จากข้อมลู 89, 78, 88, 52, 01, 36, 99, 58, 42, 33

8.1 จงแสดงการหาตำแหนง่ ท่ีอยขู่ อง 88, 58, 47
8.1 จงแสดงการลบข้อมูลต่อไปนี้ 78, 52 พร้อมทัง้ เพมิ่ 79

บรรณานุกรม

ขนิษฐา นามี และคณะ. (2548). โครงสร้างข้อมูลและอัลกอริธึม. นนทบรุ ี : ไอดีซีฯ.
จไุ รรตั น์ รตั นอาภาโรจน์. (2542). โครงสรา้ งข้อมูล. กรุงเทพฯ : ศนู ยก์ ารพิมพ์ ม.ราชภฏั

สวนสุนนั ทา.
ณฐั พงษ์ วารปี ระเสรฐิ และ สุธี พงศาสกุลชยั . (2552). โครงสร้างข้อมูลและอัลกอริทมึ (Data

Structures and Algorithms). กรงุ เทพฯ : เคทีพี คอมพ์ แอนด์ คอนซัลท์.
ธีรวฒั น์ ประกอบผล. (2552). โครงสรา้ งข้อมูลและอลั กอรทิ ึม. กรงุ เทพฯ : ซคั เซส มเี ดีย,
นิรุธ อำนวยศลิ ป.์ (2548). โครงสร้างขอ้ มูล:การเขยี นโปรแกรมและการประยกุ ต์. กรงุ เทพฯ :

ดวงกมล สมยั .
นสิ าชล โตอดิเทย์. (2541). โครงสร้างข้อมูล. กรุงเทพฯ : โอเดียนสโตร์.
บญุ เจริญ ศริ ิเนาวกุล และ พิพัฒน์ ศุภศิริสนั ต์. (2550). โครงสรา้ งข้อมูลและอัลกอริธึม.

กรงุ เทพฯ : ทอ้ ป.
ลิปชูทช์ ซีมัวร.์ (2540). ทฤษฎแี ละตวั อยา่ งโจทย์โครงสร้างข้อมลู . กรงุ เทพฯ : แมคกรอ-ฮลิ

อินเตอร์เนช่ันแนล เอ็นเตอรไ์ พรส์ อิงค.์
วิวฒั น์ อภสิ ิทธ์ิภญิ โย และคณะ. (2548). โครงสรา้ งข้อมลู . กรุงเทพฯ : เอ-บุ๊ค ดิสทรบิ วิ ชน่ั .
สมจิตร อาจอนิ ทร์. (2540). หลักการเขยี นโปรแกรมภาษาปาสคาล ฉบบั ปรับปรุง. (พิมพค์ รง้ั ท่ี 2).

กรุงเทพฯ : สามัคคีสาร (ดอกหญ้า).
สมจิตต์ ลขิ ิตถาวร. (2543). โครงสร้างข้อมลู และการโปรแกรมข้ันสงู . กรงุ เทพฯ : แผนกตำรา

และคำสอน มหาวิทยาลัยกรงุ เทพ.
สมจิตต์ ลขิ ติ ถาวร. (2547). โครงสร้างขอ้ มลู และการวิเคราะห์อลั กอริทมึ ด้วยซี. กรุงเทพฯ

: ซีเอด็ ยเู คชนั่ .
อนงค์นาฎ ศรีวิหค และคณะ. (2547). โครงสร้างข้อมลู และอัลกอรทิ ึม. กรุงเทพฯ : มลู นธิ ิ สอวน.
โอภาส เอ่ียมสริ ิวงศ์. (2548). โครงสรา้ งขอ้ มลู (DATA STRUCTURES) เพ่ือการออกแบบ

โปรแกรมคอมพิวเตอร์. กรุงเทพฯ : ซเี อ็ดยเู คช่ัน.
โอภาส เอย่ี มสิรวิ งศ์. (2548). วิทยาการคอมพวิ เตอร์และเทคโนโลยีสารสนเทศ. กรุงเทพฯ :

ซเี อ็ดยูเคช่ัน.
Alfred V. Aho, Jeffrey D.ullman. (1983). Data Structures and Algorithms.

Bell Telephone Laboratories, Incorporated.
Anany Levitin. (2003). Introduction to The Design and Analysis of Algorithms.

Pearson Education, Inc.

176

บรรณานุกรม (ตอ่ )

Drozdek , Adam. (2000). Data Structure and Algorithms in C++. 2nd Ed. Boston,
MA : Course Technology, Inc.

Mark Allen Weiss. (2002). Data Structures and Problems Solving. (2nded).
Addison Wesley.

Peter Brass. (2008). Advance Data Structures. Cambridge University Press.
Robert R. Korfhage, Norman E. Gibbs. (1987). Principles of Data Structures and

Algorithms With Pascal (Hardcover). William C Brown Pub.
Simon Harris, James Ross. (2006). Beginning Algorithms. Wiley Publishing Inc.
Thomas H.Cormen, Charles E. Leiserson. (1998). Introduction to Algorithms

(Hardcover). New York : Springer-Verlag.
Weiss, Mark Allen. (1994). Data Structures and Algorithm Analysis in c++.

The Benjamin/Cummings.


Click to View FlipBook Version