Sorting
- 1. การเรีย งลำา ดับ ข้อ มูล (Sorting)
การเรียงข้อมูลแบ่งได้เป็นสองลักษณะคือ
1. การเรีย งข้อ มูล แบบภายใน (Internal Sorting)
ข้อมูลจะเก็บอยู่ในหน่วยความจำาหลัก (main
memory) และการเรียงลำาดับข้อมูลสามารถอ่านข้อมูล
แต่ละชิ้นจากหน่วยความจำาหลักหรือเขียนข้อมูลสู่
หน่วยความจำาหลักได้เลย โดยไม่จำาเป็นต้องใช้หน่วย
ความจำารอง เช่น ดิสก์ (disk) หรือเทป (tape) สำาหรับเก็บ
ผลลัพธ์ชั่วคราว
1
- 2. 2. การเรีย งลำา ดับ ข้อ มูล แบบภายนอก (External
Sorting)
ข้อมูลมีจำานวนมากเกินกว่าทีจะบรรจุลงในพืนที่
่ ้
ความจำาหลักได้หมดภายในคราวเดียว จึงต้องแบ่ง
ข้อมูลออกเป็นส่วนย่อย ๆ ซึ่งแต่ละส่วนมีขนาดใหญ่
พอทีจะอยูในหน่วยความจำาหลักได้ และจะได้รับการ
่ ่
เรียงโดยใช้แบบการคำานวณ การเรียงข้อมูลแบบ
ภายนอกจะต้องคิดถึงเวลาทีสูญเสียไปอันเนื่องจาก
่
การถ่ายเทข้อมูลระหว่างเทปหรือดิสค์กับหน่วยความ
จำาหลักด้วย เวลาทีสูญเสียไปในการถ่ายเทปข้อมูล
่
ระหว่างหน่วยความจำาหลักกับเทปหรือดิสค์จะเป็นตัว
ระบุความดีเลวของแบบการคำานวณแบบเรียงข้อมูล
ภายนอก
2
- 3. การเรีย งลำา ดับ แบบ Bubble Sort
bubble sort เป็นแบบหนึงของ exchange sort จะ
่
เปรียบ เทียบค่า 2 ค่าทีติดกัน ถ้าไม่ได้อยู่ในลำาดับที่
่
เรากำาหนด เช่นจากน้อยไปมาก ก็ให้แลกเปลี่ยน
ตำาแหน่งของค่าทัง 2 ค่านัน แล้วเอาค่าน้อย (หรือค่า
้ ้
มาก ถ้าเป็นการเรียงจากค่ามากไปหาค่าน้อย)
เปรียบเทียบกับค่าถัดไปอีกเป็นเช่นนีตลอดไป
้
จนกว่าอยูในลำาดับทีถูกต้อง
่ ่
สมมติวามีรายการข้อมูล 5, 1,10, 3, 15, 2 จะ
่
เรียงโดยเทคนิคของ Bubble Sort (โดยต้องการเรียง
จากน้อยไปมากตามแนวบนลงล่าง) ทำาดังนี้
3
- 4. ขั้นตอนการทำางาน
5 1 10 3 15 2 รอบที่ 1
สลับ
1 5 10 3 15 2
1 5 10 3 15 2
สลับ
1 5 3 10 15 2
1 5 3 10 15 2
สลับ
1 5 3 10 2 15
4
- 5. 1 5 3 10 2 15 รอบที่ 2
1 5 3 10 2 15
สลับ
1 3 5 10 2 15
1 3 5 10 2 15
1 3 5 2 10 15
- 6. รอบที่ 3
1 3 5 2 10 15
1 3 5 2 10 15
1 3 5 2 10 15
สลับ
1 3 2 5 10 15
- 7. รอบที่ 4
1 3 2 5 10 15
1 3 2 5 10 15
สลับ
1 2 3 5 10 15
- 8. 2. การเรีย งลำา ดับ แบบฮีฟ ซอร์ท
(Heap Sort)
Heap เป็นต้นไม้ไบนารีที่มคุณสมบัติว่าโหนดใด ๆ ใน
ี
ต้นไม้นนจะมีค่า
ั้
คีย์ใหญ่กว่าค่าคียทอยูใน left son และ right son ของมัน (ถ้า
์ ี่ ่
โหนดนันมีลูก) ตัวอย่างดังรูป(ก) เป็น heap ส่วนรูปที่ (ข)
้ 90 70
ไม่ใช่ heap
45 35 60 50
39 22 33 30 35 75 30 40
20
รูป ก โครงสร้าง รูป ข ไม่ใช่
Heap โครงสร้าง Heap
8
- 9. ขั้น ตอนการทำา Heap Sort
มี 3 ขั้นตอน ได้แก่
1. สร้างโครงสร้าง heap
2. เอาต์พุตคีย์ที่รูตโหนด
3. ปรับแต่งต้นไม้ทเหลือให้เป็น heap
ี่
- 10. ารสร้า งโครงสร้า ง heap
ตัวอย่างจงสร้างต้นไม้แบบ heap จากข้อมูลต่อไปนี้
22 35 42 38 32 26 27 90
อินพุต ก่อนเป็นโครงสร้าง heap โครงสร้าง heap
22 22 22
I
35 22 I 35 35
35 22 22
4 35 42 I 42
2 22 42 I 22 35 22 35
10
- 11. ก่อนเป็นโครงสร้าง Heap โครงสร้าง
อินพุต 42 I 42 Heap42
38
22 35 38 35 38 35
38 22 22
I
32 42 42
38 35 38 35
22 32 I 22 32
11
- 12. อินพุ ก่อนเป็นโครงสร้าง โครงสร้าง
ต Heap42 Heap42
26 38 35
38 35
I 22 32 26
22 32 26
2 42 42
38 35 38 35
7 I
22 32 26 27 22 32 26 27
12
- 13. อินพุต ก่อนเป็นโครงสร้าง โครงสร้าง
Heap Heap
42
38 35
22 32 26 27
90 I
90 42
I 38 35
90 32 26
27
22
13
- 14. อินพุต ก่อนเป็นโครงสร้าง โครงสร้าง
Heap Heap
42
I 38 35
90 32 26 27
90
22
90 42 42 35
I
90 35
38 32 26 27
38 32 26
27
22 22
โครงสร้างHea
p ทีได้
่
14
- 15. โครงสร้าง heap ทีได้กคืออาร์เรย์
่ ็
ดังรูปที่ 6 2 3 4 5 6 7 8
1
A 90 42 35 38 32 26 27 22
ต้นไม้ที่เห็นระหว่างการสร้าง heap นั้น เป็นการ
ตีความข้อมูลในอาร์เรย์ หลังจากที่ข้อมูลเรียงในรูป
โครงสร้าง heap แล้ว จะเอาเอาต์พุตค่ารูตโหนด
ซึ่งอยู่ที่ตำาแหน่งที่ 1 ในอาร์เรย์ การเอาต์พุตจะให้
ค่า A(1) แลกที่กับค่าสุดท้ายของอาร์เรย์ A(8) การ
แทนในรูปต้นไม้ ค่าที่เอาต์พุตไปแล้วจะแทนโดย
โหนดสีเหลี่ยม
่
15
- 16. ต้นไม้รูปที่ 7 (ข) ที่ได้ (ไม่นับโหนดสีเหลี่ยม) ไม่
่
เป็นโครงสร้าง heap จากนี้ต่อไปเราต้องใช้อัลกอ
ริทึมปรับค่าคีย์ต่าง ๆ ในต้นไม้ให้มีคุณสมบัติ
heap
22
90
42 35 42 35
38 26 27 38 32 26 27
22 90
(ก) ก่อนเอาต์พุต (ข) หลังเอาต์พต
ุ
ค่า 90 ค่า 90
16
- 17. รับ ต้น ไม้ท ี่ไ ด้จ ากการแลกค่า ให้ม ีค ณ สมบัต ิ Heap
ุ
การปรับแต่งทำาได้โดยเลือนค่าที่ รูตโหนดจากบนลง
่
มาล่างดังนี้
ขั้นที่ 1 : ให้ตั้งต่าพอยน์เตอร์ I ชี้ไปยังรูตโหนด
ขั้นที่ 2 : ให้เลือกค่าที่ใหญ่ทสุดระหว่าง left son และ
ี่
right son ของโหนด I เป็น ค่าทีเลื่อนมาอยู่ที่
่
ตำาแหน่ง I ส่วนค่าคีย์ทตำาแหน่ง I ก็เลื่อนไปอยูที่
ี่ ่
ตำาแหน่ง left son หรือ right son ของมันทีมค่าใหญ่
่ ี
กว่า จากนันเลื่อน พอยน์เตอร์ I มาอยู่ทตำาแหน่งใหม่นี้
้ ี่
ขั้นที่ 3 : ทำาขั้นที่ 2 จนกว่าจะทำาไม่ได้
17
- 18. I 42
22 I
22 35
42 35
38 32 26 27
38 32 26 27
90 (ข)
90 (ก)
42
38 35
I
22 32 26 27
(ค)
90
รูป ค. การปรับต้นไม้ให้มคุณสมบัต
ี
Heap 18
- 19. I 38
27 I
27 35
38 35
22 32 26 42
22 32 26 42
90 (ข)
90
(ก) เอาต์พุตค่า
38
42 ได้
32 35
I
22 27 26 42
90
(ค) ต้นไม้นี้เป็น
Heap 19
- 21. 3. การเรีย งลำา ดับ แบบ Quick
Sort
quick sort เป็นวิธีการเรียงลำาดับข้อมูลที่
เหมาะกับลิสต์(รายการข้อมูล)ขนาดใหญ่ และ
เป็นวิธีเรียงข้อมูลทีให้ค่าเฉลี่ยของเวลาทีใช้นอย
่ ่ ้
ทีสุดเท่าทีค้นพบวิธีหนึง สมมติ A(K1, K2, ...,
่ ่ ่
Kn) เป็นลิสต์ของค่าหรือ เรคอร์ดทียงไม่ได้
่ ั
เรียง จะเลือก K1 จากนันจะแบ่งลิสต์ A นีออกเป็น
้ ้
2 ลิสต์ย่อย S1 และ S2 โดยที่
S1 ประกอบด้วยเรคอร์ดทีมค่าคีย์นอยกว่า
่ ี ้
K1
S2 ประกอบด้วยเรคอร์ดทีมีค่าคียมากกว่า
่ ์
K1 21
- 22. ลิสต์ {S1} และ {S2} เป็นค่าต่าง ๆ ทียงไม่ได้เรียง
่ ั
จากนันก็ทำาวิธีดังกล่าวซำ้ากับ {S1} และ {S2} ตาม
้
ลำาดับ (อย่างรีเคอร์ซีฟ) ในทีสุดก็จะได้ลิสต์ทเรียงตาม
่ ี่
ทีต้องการ มีขั้นตอนดังนี้
่
1. การเรียงข้อมูลจะเริ่มโดยใช้พอยน์
เตอร์ 2 ตัวคือ F และ R
ให้ F มีค่า 1 ซึ่งก็คือชี้ไปยังค่าคีย์ตัวแรก ส่วน R มีค่า
เท่ากับ n นันคือชี้ไปยังค่าคีย์ตัวสุดท้ายในลิสต์
่
2. เปรียบเทียบระหว่างค่าที่ถูกชี้โดย F
และ R จากนันแบ่งลิสต์นี้ออกเป็น 2 ลิสต์ยอย โดย
้ ่
ใช้ค่า K1 เป็นตัวเปรียบเทียบ ฉะนันพอยน์เตอร์ที่ชี้
้
ไปยัง K1 ไม่ว่าจะเป็น F หรือ R จะไม่เป็นตัวเลื่อนไป
ยังตำาแหน่งอื่น) 22
- 23. “ให้เลื่อนพอยน์เตอร์ตัวทีไม่ใช่ชี้ไปยังค่า K1 หรือทีทำา
่ ่
หน้าที่ K1 ในการเรียงเทียวนัน เมือ F พบ R ทีค่า K1 ก็
่ ้ ่ ่
เป็นอันว่าเสร็จสิ้นการเรียงเทียวนั้น”
่
ให้ชดคีย์ที่จะเรียงมีดังนี้ (27, 15, 22, 37,
ุ
11, 59, 18, 50, 42)
การเรีย งแถวที่ 1
27 15 22 37 11
59 18 50 42
F
R
27 15 22 37 11 23
- 24. 27 15 22 37
11 59 18 50 42
แลกที่ F
R
18 15 22 37
11 59 27 50 42
F
R
18 15 22 37
11 59 27 50 42
24
F
- 25. 18 15 22 37
11 59 27 50 42
แลกที่ F
R
18 15 22 27
11 59 37 50 42
F
R
18 15 22 27
11 59 37 50 42
25
F
- 26. 18 15 22 27
11 59 37 50 42
แลกที่ F
R
18 15 22 11
27 59 37 50 42
F
R จุดนี้
ณ คีย์ 27 ได้แบ่งลิสต์ทกำาหนดให้เป็นลิสต์
ี่
ย่อย 2 ลิสต์ ดังนี้
(18, 18 22, 11) 27 (59, 37,
15, 15 22 11
50, 42)
27 59 37 50 42
26
- 27. 18 15 22 11)
(27) (59 37 50 42)
แลกที่ F R
(11 15 22 18)
(27) (59 37 50 42)
F R
(11 15 22 18)
……….
F R
27
- 28. (11 15 22 18)
(27) (59 37 50 42)
แลกที่ F R
(11 15 18 22)
(27) (59 37 50 42)
F R
(11 15 18 22)
……….
FR
(11 15) (18) (22)
28
(27) (59 37 50 42)
- 29. 11 15 18 22 27 (59 37
50 42)
F R
..... (42 37 50
59)
F R
.… (42 37 50
59)
F R
…. (42 37 50
59)
F
R 29
- 30. 11 15 18 22 27 (42 37
50) (59)
F R
11 15 18 22 27 (42 37
50) (59)
F R
11 15 18 22 27 (37 42
50) (59)
F R
11 15 18 22 27 (37) (42)
(50) 59)
FR
เป็นชุดคียทเรียงเรียบร้อยแล้ว
์ ี่
30
- 31. 4. การเรีย งลำา ดับ แบบ Radix
Sort
การเรียงแบบนี้เราจะใช้แต่ละตำาแหน่ง
ตัวเลขของแต่ละคีย์ โดยเริ่มตั้งแต่ตำาแหน่ง
นัยสำาคัญน้อยที่สุด (least significant
digit) การเรียงก็ง่ายมาก ขั้นแรกให้
เตรียมถัง 10 ถัง (“ถัง” ในที่นี้อาจเป็นคิว
หรืออาร์เรย์ก็ได้) ในแต่ละเที่ยวของการ
เรียงจะใส่คาคีย์ไปเข้าแต่ละถังตามค่าตัว
่
เลขในแต่ละตำาแหน่ง)
31
- 32. ให้ชุดคียทจะเรียงมีดังนี้ (156, 425, 679, 128,
์ ี่
420, 067, 772, 895, 825)
การเรีย งเทีย วที่ 1 กระจายค่าคียไปตามถังต่าง
่ ์
ๆ ตามค่าตัวเลขทีตำาแหน่งขวาสุด 156 425 679
่
128 420 067 772 895 825
ถังที่ 0 420
ถังที่ 1
ถังที่ 2 772
ถังที่ 3
ถังที่ 4
ถังที่ 5 425 895 825
ถังที่ 6 156
ถังที่ 7 067
ถังที่ 8 128
ถังที่ 9 679 32
- 34. เมืออ่านค่าต่าง ๆ ในแต่ละถังออกมาตามลำาดับจะได้
่
420 425 825 128 156 067
772 679 895
การเรีย งเทีย วที่ 3 ในเทียวนีเราจะ
่ ่ ้
พิจารณาตำาแหน่งซ้ายสุด
420 425 825 128 156 067
772 679 895
ถังที่ 0 067
ถังที่ 1 128 156
ถังที่ 2
ถังที่ 3
ถังที่ 4 420 425
ถังที่ 5
ถังที่ 6 679
ถังที่ 7 772 34
- 36. 5. การเรีย งลำา ดับ แบบ Shell Sort
การเรียงลำาดับแบบ Shell Sort จะทำาการแบ่ง
ข้อมูล โดยกำาหนดค่าทีจะอยู่ในลิสต์ยอยหนึ่ง ๆ ด้วย
่ ่
การกำาหนดค่า h เป็นระยะทางระหว่างค่าสองค่าใด ๆ
ในคียชุดนั้นทีจะอยู่ในลิสต์ยอย แต่ละลิสต์ยอยจะมี
์ ่ ่ ่
การเลือกค่า hi วิธีการเลือกค่า hi มีอยู่หลายแบบ
คีย์อยู่ประมาณ n/h ค่า
ในทีนี้จะกล่าวถึง 2 แบบ คือ
่
1. ให้เลือก hi = 2i - 1 โดยที่ค่า i อยูระหว่าง 1 และ
่
(log2 n)
2. ชุดค่า hi ที่ใช้ไ = ีอ แบบหนึ่งกำาหนดโดย
Hi ด้ด3iีก-
12
สมการ บค่า i อยูระหว่าง 1 และ t โดยที่ t เป็นค่า
สำาหรั ่
จำานวนเต็มน้อยที่สดทีสอดคล้องกับ อสมการ ht
ุ ่
+ 2 >= n
36
- 37. ตัว อย่า ง
จงเรียงลำาดับข้อมูลต่อไปนี้ 37, 32, 14, 45,
92, 18, 19, 34, 31, 35 โดยใช้
วิธีการเรียงลำาดับแบบ Shell Sort
ขั้น ตอนการทำา งาน
จะเลือกค่า hi จากแบบ (1) ทีกล่าวมาแล้ว เนืองจาก
่ ่
n = 10 จะได้ว่า
(log2 10) = 3
ดังนั้นค่า i ทีใช้คือ 3, 2 และ 1 และจากสมการ hi =
่
2i - 1 จะได้
h3 = 7, h2 = 3, h1 = 1 ตามลำาดับ
37
- 38. การเรียง H3= 7
เที่ยวที่ 1
37 32 14 45 92 18
19 34 31 35
การเรียงเที่ยวที่ 1 จะมี 3 ลิสต์ย่อย ดังที่
แสดงโดยเส้นที่โยงไว้ 3 ลิสต์ย่อยนี้คือ
(37, 34) (32, 31) (14, 35) หลังจาก
การเรียงแต่ละลิสต์ย่อยแล้วจะได้ชดตัวเลข
ุ
ดังนี้
38
- 39. การเรียงเที่ยวที่ 1 จะมี 3 ลิสต์ย่อย ดังที่แสดง
โดยเส้นที่โยงไว้ 3 ลิสต์ย่อยนี้คอ (37, 34)
ื
(32, 31) (14, 35) หลังจากการเรียงแต่ละลิสต์
ย่อยแล้วจะได้ชดตัวเลขดังนี้
ุ
การเรีย งเที่ย วที่ 2
h2= 3
34 31 14 45 92 18
19 37 32 35
39
- 40. การเรียงเที่ยวนี้จะประกอบด้วย 3 ลิสต์ย่อย คือ
(34, 45, 19, 35)
(31, 92, 37) และ (14, 18, 32) หลังจาก
การเรียงแต่ละลิสต์ย่อยแล้วจะได้
19 31 14 34 37 18
35 92 32 45
การเรีย งเทีย วที่ 3 h1= 1
่
การเรียงเทียวนีจะประกอบด้วยลิสต์เพียงลิสต์
่ ้
เดียว นั่นคือทุกค่าในลิสต์นี้ การเรียงเท่ากับการใช้
insertion sort หรือการเรียงแบบอื่น ๆ
19 31 14 34 37 18
35 92 32 45 40
- 41. แบบฝึก หัด
1. จากข้อมูล 156, 425, 679, 128, 420, 067,
772, 895, 835 จงเรียงลำาดับ
ข้อมูลจากน้อยไปหามากด้วยวิธีการเรียงแบบ
Bubble Sort
2. จงเรียงลำาดับโดย Bubble Sort และสร้างต้นไม้
แบบ Heap จากข้อมูลต่อไปนี้
45 , 20 , 9 , 100 , 32 , 28 , 1
3. จากโครงสร้างต้นไม้แบบ Heap ทีได้ในข้อ 2 ให้
่
นำาเอาท์พตที่ Root Nod
ุ
ออก พร้อมปรับแต่งต้นไม้ให้เป็น Heap
41